Code looks like below.
Code: Select all
while (1) {
spi_device_handle_t spi;
spi_bus_config_t buscfg = {
.miso_io_num=PIN_NUM_SPI_MISO,
.mosi_io_num=PIN_NUM_SPI_MOSI,
.sclk_io_num=PIN_NUM_SPI_CLK,
.quadwp_io_num=-1, .quadhd_io_num=-1,
};
spi_device_interface_config_t devcfg = {
.spics_io_num=PIN_NUM_SPI_ADC_CS,
.clock_speed_hz=1*1000*1000, // 1MHz
.mode=1, // SPI MODE 1
.command_bits=8, // 8-bit command length
.address_bits=0, // no address
.queue_size=2,
};
// should I use DMA? Does it work?
ESP_ERROR_CHECK(spi_bus_initialize(VSPI_HOST, &buscfg, 0/*dma_chan - 0 no DMA*/));
ESP_ERROR_CHECK(spi_bus_add_device(VSPI_HOST, &devcfg, &spi));
// how to declare rx_data buffer for DMA usage?
uint8_t rx_data[10];
memset(rx_data, 0x00, sizeof(rx_data));
ESP_LOGE(TAG, "write RESET");
spi_transaction_t transaction;
memset(&transaction, 0, sizeof(transaction));
transaction.cmd = RESET;
assert(spi_device_polling_transmit(spi, &transaction) == ESP_OK);
vTaskDelay(1 / portTICK_RATE_MS);
ESP_LOGE(TAG, "writeDefaultConfig");
uint8_t data[4] = {DEFAULT_CONFIG_REG0, DEFAULT_CONFIG_REG1, DEFAULT_CONFIG_REG2, DEFAULT_CONFIG_REG3};
memset(&transaction, 0, sizeof(transaction));
transaction.cmd = WREG | 0b0000;
transaction.length = 4*8;
transaction.tx_buffer = data;
assert(spi_device_polling_transmit(spi, &transaction) == ESP_OK);
ESP_LOGE(TAG, "read RREG");
memset(&transaction, 0, sizeof(transaction));
transaction.cmd = RREG | 0b0000;
transaction.rx_buffer = rx_data;
transaction.rxlength = 4*8;
// should I set .length equal .rxlength? Does .length count .cmd bytes?
transaction.length = 4*8;
assert(spi_device_polling_transmit(spi, &transaction) == ESP_OK);
ESP_LOG_BUFFER_HEX("Received", rx_data, 10 );
memset(rx_data, 0x00, sizeof(rx_data));
ESP_LOGE(TAG, "read single register");
uint8_t address = 1;
memset(&transaction, 0, sizeof(transaction));
transaction.cmd = RREG | (address<<2);
transaction.rx_buffer = rx_data;
transaction.rxlength = 8;
transaction.length = 8;
assert(spi_device_polling_transmit(spi, &transaction) == ESP_OK);
ESP_LOG_BUFFER_HEX("Received", rx_data, 10 );
ESP_LOGE(TAG, "End");
spi_bus_remove_device(spi);
vTaskDelay(2500 / portTICK_RATE_MS);
}
eg. I send 0x03, received is 0x81 and 0x80 in next byte
What to do? I am using current idf.