Problem(assert) with spi_device_transmit()
Posted: Wed Aug 15, 2018 2:37 pm
Hi guys,
I'm trying to use SPI Master driver to control a DWM1000 module on my custom board.
Almost everything is fine, but after a while: I get an assertion. I checked with a counter and it fails at different palces at every turn.
I know that, the standard anwser is the following: "You can't use spi_device_transmit() if any transmission is queued with spi_device_queue_trans() but not exectued with spi_device_get_trans_result()."
The main problem is: I use only spi_device_transmit() in my code so anything shouldn't be queued.
The settings and related parts of my code:
One more thing: the assertion message is often wierd because some characters are not on corresponding place (as you can see above).
Any idea what can go wrong/I missed?
I'm trying to use SPI Master driver to control a DWM1000 module on my custom board.
Almost everything is fine, but after a while: I get an assertion. I checked with a counter and it fails at different palces at every turn.
Code: Select all
assertion "ret_trans==trans_desc" failed: file "C:/msys32/home/heged/esp/esp-idf/components/driver/spi_master.c", line 892, function: spi_device_transmit
abort() was cassertion alled at PC 0"ret_transx400d2fbf on ==trans_decore 0
The main problem is: I use only spi_device_transmit() in my code so anything shouldn't be queued.
The settings and related parts of my code:
Code: Select all
spi_bus_config_t buscfg={
.miso_io_num=DW1000_MISO_PIN,
.mosi_io_num=DW1000_MOSI_PIN,
.sclk_io_num=DW1000_SCK_PIN,
.quadwp_io_num=-1,
.quadhd_io_num=-1,
.max_transfer_sz=4096
};
spi_device_interface_config_t devcfg={
.clock_speed_hz = 1*1000*1000,
.mode = 0,
.spics_io_num = DW1000_SS_PIN,
.queue_size = 7,
.flags = SPI_DEVICE_HALFDUPLEX,
};
Code: Select all
void spi_set_rate_low(void)
{
printf("SET LOW\n");
spi_bus_remove_device(spi);
devcfg.clock_speed_hz=1*1000*1000;
spi_bus_add_device(VSPI_HOST, &devcfg, &spi);
}
void spi_set_rate_high(void)
{
printf("SET HIGH\n");
spi_bus_remove_device(spi);
devcfg.clock_speed_hz=8*1000*1000;
spi_bus_add_device(VSPI_HOST, &devcfg, &spi);
}
Code: Select all
int writetospi(uint16 headerLength, const uint8 *headerBuffer, uint32 bodylength, const uint8 *bodyBuffer)
{
spi_transaction_t trans;
memset(&trans, 0, sizeof(spi_transaction_t));
uint8_t bigBuffer[headerLength*8+bodylength*8];
for(uint16_t i = 0; i < headerLength; i++) {
bigBuffer[i] = headerBuffer[i];
}
for(uint16_t i = 0; i < bodylength; i++) {
bigBuffer[i+headerLength] = bodyBuffer[i];
}
trans.length = headerLength*8+bodylength*8;
trans.tx_buffer = bigBuffer;
if(spi_device_transmit(spi, &trans) != ESP_OK)
{
printf("SPI WRITE ERROR!\n");
return -1;
}
return 0;
}
Code: Select all
int readfromspi(uint16 headerLength, const uint8 *headerBuffer, uint32 readlength, uint8 *readBuffer)
{
spi_transaction_t trans;
memset(&trans, 0, sizeof(trans));
trans.length = headerLength*8;
trans.rxlength = readlength*8;
trans.tx_buffer = headerBuffer;
trans.rx_buffer = readBuffer;
uint32_t err_code = spi_device_transmit(spi, &trans);
if(err_code != ESP_OK) {
printf("SPI READ ERROR!\n");
return -1;
}
return 0;
}
Any idea what can go wrong/I missed?