最近搞了一下ESP32与STM32之间的SPI通信,这一路曲曲折折耗费了很长时间,下面我把我的debug踩坑经历奉献出了,希望大家不要犯我这样的错误。
如果你最近也像我一样在做类似的测试且遇到困难,请自查有没有以下问题:
①“SPI_SCLK时钟极性”匹配:对应esp-idf的spi_slave库中(receiver例程)的.mode
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
};
如果和我一样为0,那么STM32中的极性应该设置为:
hspi5.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi5.Init.CLKPhase = SPI_PHASE_1EDGE;
如果为其它的设置,请翻阅手册,或参考CSDN大佬们的回答,在此不作介绍。
②请接地线和电源线
这是我遇到的最主要的问题,到了最后我确定基本都没问题后,还是不对的原因就是因为:STM32与ESP32的电源和地线我没有连接到一起,这引发了严重的问题:不管是握手协议的引脚还是数据或者时钟线都可能出现很大的问题。
上面是共地共电源的接收,下面是非共地共电源的接收(都是泪呀。。。)
③其余易错点:自查握手协议是否正确理解,自查STM32如果用HAL库配置的话是否“使能”、库函数发送指针是否为空,自查第三方板子相关引脚是否有复用(复用可能对SPI造成干扰)等问题。
④另外,关注一下ESP32的时钟频率:我由于方便插面包板,ESP32使用了GPIO_MUX复用到其它引脚 ,这种方式虽然比使用原来的引脚能承受的时钟频率慢一些(没记错的话可能20多M左右),但是似乎能解决我一开始自带管脚无法通信的问题(ESP32互相通信时是这样,后来没再测试)
附:后续待我写完ESP32与STM32握手协议的博客,会把源程序发出来。