1、STM32F407的SPI1的波特率最高,但也只能到37.5Mbits/s。和SPI从设备交互时,不能只看从设备的SPI能力,得按主从设备的低限确定系统的整体波特率;
2、SPI+DMA时,发送和接收都会很快,从波形看,字节间几乎没有明显的间隔。但在读取从设备的地址空间时,从设备往往需要一定的时间准备数据,如果主设备读取太快,从设备的数据准备时间不足,会导致读取错误。此时,可不使用DMA,而是采用阻塞式或中断式SPI收发函数。经测试HAL_SPI_TransmitRecieve()会在字节间有约0.8us的空档;HAL_SPI_Transmit()会快些,间隔大约0.1us;
3、SPI+DMA的另一个问题就是:CPU调用DMA函数后并不会等待数据传输完成,而是直接运行后续程序,这就给拉高片选(NSS)以及得到的数据做后续处理带来问题,比如SPI还未传输完就拉高了NSS,或者还没完全读出数据就拿来做判断处理。于是为了解决这些问题,还得用定时器做中断拉高NSS及开始后续处理等,反而麻烦。而不使用DMA,采用阻塞式或中断式SPI收发函数则可避免这一问题;
3、SPI从设备往往需要主设备在通信的开头几个字节里写入命令和地址,如果需要往一个地址开始写入大量数据,且需要根据情况从不同的数组中取数,那就可以采用”先发字头再发数据“的方法(而且使用Transmit函数比较快):
void Write_Data(uint32_t Addr, uint8_t* pBuf, uint16_t len)
{
HAL_GPIO_WritePin(W5100S_SCS_GPIO_Port, W5100S_SCS_Pin, GPIO_