一些无关spi的tips: 局部变量定义在栈空间,而全局变量定义在内存空余的空间。如果在函数中写入数据发生内存溢出不妨试试定义全局变量来存放数据 ss线:低电平表示选中当前设备,高电平表示未选中,当ss线为低电平时另外三根线才有用,ss线时每个从机都有一根独立的,而SCK、MOSI、MISO则是通用的,只是看哪个设备被选中就激活哪个设备而已。 SCK线:时钟信号线,用于同步通讯数据。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如STM32的SPI时钟频率最大为fock/2,两个设备之间通讯时,通讯速率受限于低速设备。 ; v6 [2 H: [$ a9 \8 b; |' K/ V {" u·MOSI(Master Output,Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。·MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。 时钟极性CPOL是指SPI通讯设备处于空闲状态时,SCK信号线的电平信号(即SPI通讯开始前、NSS线为高电平时SCK的状态)。CPOL=0时,SCK在空闲状态时为低电平,CPOL=1时,则相反。时钟相位CPHA是指数据的采样的时刻,当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的“奇数边沿”被采样。当CPHA=1时,数据线在SCK的“偶数边沿”采样。 由CPOL及CPHA的不同状态,SPI分成了四种模式,主机与从机需要工作在相同的模式下才可以正常通讯,实际中采用较多的是“模式0”与“模式3”。 FLASH的存储特性:1.在写入数据之前必须先擦除2.擦除时会把数据位全重置为13.写入数据时只能把为1的数据位改成04.擦除时必须按最小单位来擦除(一般为扇区)norflash 可以一个字节写入nandflash 必须以块或扇区为单位进行读写 1 J. n& e) Y0 D- U代码部分 初始化结构体 配置完这些结构体成员后,要调用SPI_lnit函数把这些参数写入到寄存器中,实现SPI的初始化,然后调用SPI_Cmd来使能SPI外设。 SPI_GPIO_Config(): 两个函数封装起来 ; F9 U9 }0 B# J3 w' ]. a这个函数可有可无,因为上一个函数已经实现接收数据 读取内容 写入内容 下图中代码漏了,每次要写入数据都要写使能,擦除数据的本质其实也是写数据,并且写入命令的代码错了应该是这个 需要注意的是page write每次只能写入1~256个字节的数据,如果要写更多数据就要多次调用函数。 并且每次写入之前都要先擦除操作,否则写出来的数据会乱,因为flash只能把数据从1改成0,不能从0改成1 |
STM32固件库分享,超全系列整理
STM32G030F6P6基于HAL库模拟SPI驱动1.8寸TFT LCD屏幕
STM32的CAN FD位定时设置注意事项
基于STM32将移植 SBSFU 到 STM32G070过程分享
基于STM32G030 RAM不够用经验分享
STM32G070在OLED上移植U8G2单色GUI
【经验分享】STM32 IAP+Ymodem功能实现(参考官方代码)
【经验分享】STM32的SPI问题
【经验分享】STM32 的加密实现
STM32G070—使用platformio+arduino