这里主要讲一下思路,模拟SPI重点是搞懂时序,其他问题迎刃而解。 附件是优化后的SPI通信程序,发送速率能达到14M,接收数率能达到11.2M。
1.硬件连接:
三线SPI
三根线(STM32F407作为主机): MOSI:发送和接收(将FLASH的MISO和MOSI之间用一个220R电阻连接) CLOCK:时钟 CS:使能
2.重点掌握读写时序:(★★★★★) 1.发送数据时,上升沿发送 拉低时钟线 --> 发送1bit数据 --> 拉高时钟线(此时数据才发送出去) 2.读取数据时,下降沿读取 拉低时钟线 --> 拉高时钟线 --> 读取1bit数据 (此时数据已读取完成)
3.源代码: /* * @Description: SPI发送字节数据 * @param: txd,待发送字节数据 * @return: none */ #pragma O3 void spiSendByte(u8 txd) { u8 i; SPI_CLOCK_LOW(); for(i=0;i<8;i++) { WRITE_SPI=(txd&0x80)>>7; SPI_CLOCK_HIGH(); txd<<=1; SPI_CLOCK_LOW(); } } /* * @Description: SPI接收字节数据 * @param: none * @return: 接收的字节数据 MSB Frist */ u8 spiReceiveByte(void) { u8 i,receive=0; for(i=0;i<8;i++ ) { receive<<=1; SPI_CLOCK_HIGH(); if(READ_SPI){ receive|=0x01; } SPI_CLOCK_LOW(); } return receive; } |