esp32 spi_slave

 

 

#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);


    }

}

 

posted on 2022-09-05 23:33  lydstory  阅读(212)  评论(0)    收藏  举报

导航