ESP-IDF SPI Slave Receiver Example - Not receiving whole message.
Posted: Wed Jul 08, 2020 2:09 pm
Hello friends, I'm an ESP32 newbie and I'm getting some doubts. Right now I'm trying to make my FPGA communicate with my ESP32 via SPI. The FPGA is working as the master and its working as intended, but sometimes the ESP32 doesnt read the whole message. The image attached shows the received messages. The first one with hex numbers from 0180 to 8001 is the correct message, the second ones is incomplete (7a7a comes from the memset I do every iteration of the code). Can anyone help me understand this? The master is workin on a 1MHz clock.
Im sending 128 16 bit numbers.
Regards, Tales.
Code: Select all
#define GPIO_HANDSHAKE 2
#define GPIO_MOSI 23//12
#define GPIO_MISO 19//13
#define GPIO_SCLK 18//15
#define GPIO_CS 5//14
//Called after a transaction is queued and ready for pickup by master. We use this to set the handshake line high.
void my_post_setup_cb(spi_slave_transaction_t *trans) {
WRITE_PERI_REG(GPIO_OUT_W1TS_REG, (1<<GPIO_HANDSHAKE));
}
//Called after transaction is sent/received. We use this to set the handshake line low.
void my_post_trans_cb(spi_slave_transaction_t *trans) {
WRITE_PERI_REG(GPIO_OUT_W1TC_REG, (1<<GPIO_HANDSHAKE));
}
//Main application
void app_main()
{
int n=0;
esp_err_t ret;
//Configuration for the SPI bus
spi_bus_config_t buscfg={
.mosi_io_num=GPIO_MOSI,
.miso_io_num=GPIO_MISO,
.sclk_io_num=GPIO_SCLK
};
//Configuration for the SPI slave interface
spi_slave_interface_config_t slvcfg={
.mode=0,
.spics_io_num=GPIO_CS,
.queue_size=3,
.flags=0,
.post_setup_cb=my_post_setup_cb,
.post_trans_cb=my_post_trans_cb
};
//Configuration for the handshake line
gpio_config_t io_conf={
.intr_type=GPIO_INTR_DISABLE,
.mode=GPIO_MODE_OUTPUT,
.pin_bit_mask=(1<<GPIO_HANDSHAKE)
};
//Configure handshake line as output
gpio_config(&io_conf);
//Enable pull-ups on SPI lines so we don't detect rogue pulses when no master is connected.
gpio_set_pull_mode(GPIO_MOSI, GPIO_PULLUP_ONLY);
gpio_set_pull_mode(GPIO_SCLK, GPIO_PULLUP_ONLY);
gpio_set_pull_mode(GPIO_CS, GPIO_PULLUP_ONLY);
//Initialize SPI slave interface
ret=spi_slave_initialize(HSPI_HOST, &buscfg, &slvcfg, 1);
assert(ret==ESP_OK);
uint16_t recvbuf[129];
spi_slave_transaction_t t;
memset(&t, 0, sizeof(t));
int cont = 0;
memset(recvbuf, 122 , 256 );
while(1) {
memset(recvbuf, 122 , 256 );
t.length = 128*16;
t.trans_len = 128*16;
t.rx_buffer= recvbuf;
/* This call enables the SPI slave interface to send/receive to the sendbuf and recvbuf. The transaction is
initialized by the SPI master, however, so it will not actually happen until the master starts a hardware transaction
by pulling CS low and pulsing the clock etc. In this specific example, we use the handshake line, pulled up by the
.post_setup_cb callback that is called as soon as a transaction is ready, to let the master know it is free to transfer
data.
*/
ret=spi_slave_transmit(HSPI_HOST, &t, portMAX_DELAY);
//spi_slave_transmit does not return until the master has done a transmission, so by here we have sent our data and
//received data from the master. Print it
//printf("%04x ;", recvbuf[0]);
for(int i=0;i<128;i++)
printf("%04x; ", recvbuf[i]);
printf("\n");
n++;
}
}
Regards, Tales.