选择了与硬件打交道,就得戒骄戒躁,踏踏实实,一步一步的走下去。可能因为一个非常小的问题,就导致你失败。失败不可怕,可怕的是不能静下心来去思考。我在公司第一次调试硬件,spi的通信,是stm32的硬件既有的通信接口。之前用51的io口模拟过i2c的,感觉spi相对来说更简单些,结果调试spi的读写花费了我3天的时间。stm32f0与网上关于stm32f1大量的例程还不一样,刚刚上市半年多,应该是,并且有几项设置是stm32f1没有的,这也正是关键的地方。你直接把他们的程序拿过来用,可能就卡死了,为什么?因为f0多了个fifo设置,fifo不设置,默认应该是half of 32 bits,当你只接收到8个bit时,rxne不会置位,程序会一直在这里等待。或许你会说,加一个容错处理不就完了。但是这样,可能读完后,数据是缺少第一个byte和最后一个byte的,还可能出现只读到偶数位的数据(与数据处理有关),因为在读第二个的时候读到的其实是fifo中的低8bit,高8bit如果没有处理可能就丢了,比如你定义的接收数据为unsigned char,高8bit就被滤掉了。如果接收的数据byte数为奇数,可能最后一byte可能就读不出来了,直到下次再有数据才能把它挤到高8bit上。这样读出的数据怎么也不会正确了。
为避免这种情况,设置下fifo就可以了,满了8bit就置位rxne,就可以读走接收到的数据。fifo设置为与通信数据bit数相同就行了。
spi的收发可以设置为全双工模式,但是时钟却都是由主机控制的,在读从机数据时,需要发送从机内部数据的地址,接着需要提供要求的n个时钟信号,才能把从机的数据读出来。这时需要发送无效的数据位来产生时钟,无效数据一般可以为0xff或者0x00,这个需要根据不同主机在使能后mosi线的电平以及从机设备要求来确定。
另外硬件spi需要设置相关的时钟极性,以及第一个时钟沿还是第二个时钟沿读取数据。stm32f0需要设置时钟线在闲置时的电平上拉还是下拉。
spi通信配置
1、GPIO时钟使能,SPI时钟使能。
2、配置GPIO片选,推挽输出,上拉;SCLK、MOSI、MISO所用到的引脚为复用功能;SCLK下拉,MOSI推挽复用,MISO无推挽。
3、SPI初始化,配置工作模式为全双工,主机模式,SCLK闲时电平为低,第二个时钟沿(下降沿)采样数据,SCLK时钟128预分频,CRC校验置默认值0x07,内部从机选择软件管理模式。设置接收FIFO为四分之一,内部从机选择设置为主机(置1),使能SPI。
4、从机设备一般上电是默认写使能的,因此若需要读取数据先关闭写使能。
5,stm32f0在使能spi后,miso和mosi都被拉低,因此在读取从机数据时,需要先发送的无效数据为0x00。