https://github.com/csodajet/multi_spi
同一个时钟信号下,多通道SPI输出高频信号Under the same clock signal, multi-channel SPI outputs high frequency signals.背景单工模式的SPI接口有2根传输线:MOSI–主器件数据输出,从器件数据输入;SCLK –时钟信号,由主器件产生;由此可以看出在单工SPI接口中,主器件只有一个数据输出通道。
那么,当我们需要在同一时钟下,同时输出多个数据,该怎么办呢?在此,我提供一些思路,将SPI改造成双输出的SPI,并在STM32单片机上验证。原理单片机无法实现真正的并行处理,也就无法实现数据同时输出。但是,对于从器件来说,只要接收的数据和时钟对齐,就是符合要求的。举个例子,一次发送16bit数据0xFF00,第1个时钟上升沿对应数据1,第二个时钟上升沿对应数据0,...,第16个时钟上升沿对应数据0,只有这样才算成功。所以,即便做不到数据同时输出,只要在同一时钟下,数据是对齐的就OK了。STM32上有多个SPI接口,利用其中两个来验证以上思路:开启SPI2,SPI,保证时钟频率相同,选择其中一个SCLK作为时钟CLK,通过优化程序,使两个SPI先后发送数据的时间差小于半个时钟周期,这样可以确保数据是对齐的。实验软件:STM32CubeMX,MDK_v5
硬件:STM32F429IGT6最小系统单片机,Kingst逻辑分析仪
代码:该项目下的程序包可由MDK_v5直接编译仿真1.CubeMX生成基本程序,设置HCLK=160HZ,设置SPI2,SPI3数据大小为16bit,波特率5MBits/s 2.MDK_v5修改程序,优化SPI2,SPI3,设置发送数据长度,数据内容等 3.MDK_v5编译仿真,Kingst逻辑分析仪捕获CLK,DATA1,DATA2三个端口数据Src/main.c主程序引脚//PC10——————CLK //PC3——————DATA1 //PC12——————DATA2
设置发送数据长度/* SET DATA LENGTH*/ #define LEN 10 /*SET END*/
设置发送数据内容/* SET DATA CONTENT */ uint16_t DATA1[LEN] = {0x0001,0x0005,0x0008,0x000C,0x0010,0x0014,0x0018,0x001C,0x0020,0x0024}; uint16_t DATA2[LEN] = {0x0001,0x0005,0x0030,0x0034,0x0038,0x004C,0x0050,0x0054,0x0058,0x005C}; /* SET END */
两个通道输出数据内容:
DATA1==>0x0001,0x0005,0x0008,0x000C,0x0010,0x0014,0x0018,0x001C,0x0020,0x0024
DATA2==>0x0001,0x0005,0x0030,0x0034,0x0038,0x004C,0x0050,0x0054,0x0058,0x005C仿真结果 ##:两个输出通道信号时间差为50ns,小于时钟周期的一半100ns,可以确保输出数据对齐
从逻辑分析仪的结果可以看到,输出数据和程序设定一致
SPI时钟频率为5Mhz,如图所示
一周热门 更多>