#define GPIO_MOSI 35
#define GPIO_MISO 37
#define GPIO_SCLK 36
#define RCV_HOST SPI3_HOST
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include <driver/gpio.h>
#include <driver/spi_master.h>
#include <driver/spi_slave.h>
#include "nvs_flash.h"
#include "w25q64.h"
void app_main(void)
{
esp_err_t err;
// Initialize NVS.
err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES) { // can happen if truncated/partition size changed
ESP_ERROR_CHECK(nvs_flash_erase());
err = nvs_flash_init();
}
ESP_ERROR_CHECK(err);
// 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,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
// .flags = SPICOMMON_BUSFLAG_IOMUX_PINS
.flags = SPICOMMON_BUSFLAG_GPIO_PINS
};
// configuration for the SPI slave interface
spi_slave_interface_config_t slvcfg={
.mode = 3, //CPOL=1, CPHA=1
.spics_io_num = -1,
.queue_size = 3,
.flags = SPI_SLAVE_BIT_LSBFIRST
};
// initialize SPI slave interface
err = spi_slave_initialize(RCV_HOST, &buscfg, &slvcfg, SPI_DMA_CH_AUTO); // can't disable DMA. no comms if you do...
spi_slave_transaction_t spi_slave_trans;
WORD_ALIGNED_ATTR uint8_t recvbuf[20];
WORD_ALIGNED_ATTR uint8_t sendbuf[20];
while(1) {
memset(recvbuf, 0x55, 20);
//Set up a transaction of 20 bytes to send/receive
spi_slave_trans.length = 20*8;
spi_slave_trans.tx_buffer = sendbuf;
spi_slave_trans.rx_buffer = recvbuf;
spi_slave_transmit(RCV_HOST, &spi_slave_trans, portMAX_DELAY);
uint8_t rx_checksum = 0;
for (uint8_t byte_cnt = 0; byte_cnt < 18; byte_cnt++) {
// calculate checksum
rx_checksum += recvbuf[byte_cnt];
}
printf("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x (calc %d) rx_checksum: %d \n",
recvbuf[0], recvbuf[1], recvbuf[2], recvbuf[3], recvbuf[4], recvbuf[5], recvbuf[6], recvbuf[7], recvbuf[8], recvbuf[9],
recvbuf[10], recvbuf[11], recvbuf[12], recvbuf[13], recvbuf[14], recvbuf[15], recvbuf[16], recvbuf[17], recvbuf[18], recvbuf[19],
(recvbuf[18]<<8)+(recvbuf[19]),
rx_checksum
);
//vTaskDelayMs(1000);
}
}