乐鑫技术交流
直播中

爱与友人

9年用户 902经验值
擅长:可编程逻辑 模拟技术 存储技术
私信 关注
[问答]

ESP32S2作SPI从机,通过FPGA给ESP32S2传输数据,为什么打印出来的数据全部是0?

我的应用是ESP32S2作SPI从机,通过FPGA给ESP32S2传输数据,一直传输,时钟为20MHZ,一次传输长度为1024BYTE,配置如下:
#define GPIO_MOSI         GPIO_NUM_11
#define GPIO_MISO         GPIO_NUM_13
#define GPIO_SCLK         GPIO_NUM_12
#define GPIO_CS         GPIO_NUM_10

#define RCV_HOST    SPI3_HOST
#define DMA_CHAN    RCV_HOST

    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,
    };
    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
    };
    gpio_set_pull_mode(GPIO_MOSI, GPIO_PULLDOWN_ONLY);
    gpio_set_pull_mode(GPIO_SCLK, GPIO_PULLDOWN_ONLY);
    gpio_set_pull_mode(GPIO_CS, GPIO_PULLUP_ONLY);

    //Initialize SPI slave interface
    spi_slave_initialize(RCV_HOST, &buscfg, &slvcfg, DMA_CHAN);

   uint8_t cam_buf[1024]="";
   uint8_t cam_buf2[1024]="";

   int len = 1024*8;
    spi_slave_transaction_t spi_recv;
    spi_recv.length=len;
    spi_recv.tx_buffer=cam_buf2;
    spi_recv.rx_buffer=cam_buf;
    gpio_set_level(ESP_RDY, 1);

配置完成后,在任务中循环执行
spi_slave_transmit(RCV_HOST, &spi_recv, portMAX_DELAY);
printf("rcv_size:%sn",cam_buf);
另外:
void my_post_setup_cb(spi_slave_transaction_t *trans) {
        gpio_set_level(ESP_RDY, 1);
}
void my_post_trans_cb(spi_slave_transaction_t *trans) {
        gpio_set_level(ESP_RDY, 0);
}
FPGA那边发送数据正常,示波器测量波形正常,为什么打印出来的数据全部是0,这里面是哪个地方设置错了吗?
还有,CS的周期是550ns,1024个字节的话应该是550us左右才对,示波器测量到的ESP_RDY的周期有时候会连续很多个是28us,这个是什么意思呢?
                                                                                                                                                         

回帖(1)

张波

2024-6-17 17:53:58
根据您提供的信息,您的ESP32S2作为SPI从机,与FPGA进行通信。您遇到的问题是在打印数据时,所有数据都为0。以下是一些建议和可能的原因:

1. 检查硬件连接:首先,请确保您的硬件连接正确。检查MOSI、MISO、SCLK和CS引脚是否正确连接到FPGA和ESP32S2。

2. 检查SPI初始化:确保您已经正确初始化了SPI接口。检查SPI配置(如时钟速率、数据位宽等)是否与FPGA端的配置一致。

3. 检查DMA配置:您提到使用了DMA通道进行数据传输。请确保DMA配置正确,包括DMA通道的选择和数据传输方向。

4. 检查数据传输逻辑:检查您的数据传输逻辑,确保数据从FPGA正确发送到ESP32S2。这可能包括检查FPGA的SPI发送逻辑和ESP32S2的SPI接收逻辑。

5. 检查数据接收和处理:在ESP32S2上,确保您正确地接收和处理了从FPGA接收到的数据。这可能包括检查数据缓冲区的大小、数据读取和打印逻辑等。

6. 检查时钟速率:您提到时钟速率为20MHz。请确保这个速率在您的系统中是可行的,并且不会导致数据同步问题。

7. 检查电源和地线:确保您的电源和地线连接稳定,以避免潜在的噪声干扰。

8. 使用调试工具:如果可能的话,使用逻辑分析仪或其他调试工具来检查SPI通信,以确定问题所在。

综上所述,您需要检查硬件连接、SPI初始化、DMA配置、数据传输逻辑、时钟速率、电源和地线等方面,以找到问题所在并解决。希望这些建议对您有所帮助。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分