本帖最后由 沧月辉 于 2017-1-22 13:10 编辑
STM32 用作SPI从机,之前搞了很久终于搞定,现在回馈给大家希望能帮大家的忙//主要参考原子哥的代码
//我上传的这套代码从机是用来:使用STM32 12位ADC采集18路信号,然后通过SPI传输给主机。主机通过发送命令0x6018,然后18次循环读取来获取采集的信号。由于硬件不同,STM32没有18个ADC所以硬件上面只用到10个ADC+一个模拟开关来切换,从而来实现20路的采集。所以采集一行 相当于开启了两轮ADC采样,每一轮10个通道,主频是72MHz,6分频,因而ADC的时钟 是12MHz,为了加快ADC转换速度使用转换时间ADC_Sample time_1Cycles5为最少的时间,所以(采样时间12.5个周期+转换时间1.5周期)=14个周期。一个通道需要(1*1000*1000/12000 000)*14=1.17us。所以转换两轮20次就要使用1.17*20=23.4us。所以上位机至少要延时30us,才能发送下一个命令进行采样。不然数据就不对了。
//从机种 使用SPI2作为SPI接口(PB12~PB15),其中片选信号作为外部中断信号,主机片选拉低 的时候 从机进入中断,执行中断代码(我猜这就是为什么片选拉低能通讯的原因吧)。从机中断代码中,判断命令,执行相应命令下面的代码。
//可以不使用DMA,但这样用示波器抓出来的CLK不是连续的,命令与命令之间大概有3us的空隙。这也是开始为什么速度上不去的原因。如果使用DMA SPI CLK就是连续的,从而可以大大加快传输速度。一般大数据都用DMA。
//使用SPI从机和主机接线时: 网上有两种版本的接法, 从机的CS接主机 的CS,从机的CLK接 主机的CLK。这两点没有意义,下面 从机的MOSI接主机 的MOSI呢还是接主机 的MISO呢?正确的接法 应该是 MOSI(从机)接 MOSI(主机),MIOS(从机)接MISO(主机)。网上另一种主从反接是错误的 至少我没用出来。
//从机引脚配置,CLK和MOSI需要配置成浮空输入,MISO则配置成推挽复用输出,片选设置成为外部中断,低电平有效。而主机引脚配置,CLK MOSI 配置成为挽复用输出,CS配置成为推挽输出,MISO则配置成为浮空输入。从机的SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_x;这段不需要和主机匹配,CLK是主机控制的主机给多少从机就是多少,这里就算设置不一样也没事,我试了一下都可以用 没出现其他问题。
//主机就不多说了,看原子哥的代码就好了
3
|
|
|
|
谢谢分享
|
|
|
|
|
谢谢分享!!!
|
|
|
|
|
谢谢分享!!!
|
|
|
|
|