
while(1)
{
a=0b10101010
SPI_CR2 = 0b00000011//0X03
SPI_CR1 = 0b01001100//0X4C //8MHZ(HSE = 16MHZ)
while(1)
{
//while(!TXE)
for(sendCnt=0sendCnt<8sendCnt++)
{
while((SPI_SR&0b00000010)==0b00000010)
SPI_DR = 0xAA
if((SPI_SR&0b00000001)==0b00000001)
{
b=SPI_DR
}
else
{
//error flag
}
}
SPI_NSS=1
delay(40000)
SPI_NSS=0
while((SPI_SR&0b00000010)==0b00000010)
SPI_DR = 0xAA
}
}
接收
SPI_CR2 = 0b00000000//0X03
SPI_CR1 = 0b00011000//0X4C //8MHZ(HSE = 16MHZ)
RXIE=1
EI()
SPE=1
sentPoint=sentArray
receivePoint=receiveArray
//a=SPI_DR
//a=0
SPI_DR=*sentPoint
while(!TXE){}//è·±£2??ù·¢?í?D
a=SPI_DR
a=0
sentPoint++
SPI_DR=*sentPoint
while(1)
{
if(PEI_5==1)//如果有错误发生
{
if(receiveCnt!=0)
{
SPE=1
sentPoint=sentArray
receivePoint=receiveArray
SPI_DR=*sentPoint
while(!TXE){}//è·±£2??ù·¢?í?D
a=SPI_DR
a=0
sentPoint++
SPI_DR=*sentPoint
receiveCnt=0
}
}
I/O口自己设一下
SLAVE是不用主动进行 *** 作的我没用过STM32,不过可以从SPI接口的原理来解释一下,一般都是按我说的方式工作SPI需要设为MASTER/SLAVE,而且必须一方为主,另一方为从,同步的时钟信号由主设备输出,从设备根据主设备给出的时钟信号进行相应 *** 作。主设备:配置好相关寄存器---->写数据到SPI数据寄存器---->输出时钟脉冲的同时将数据移位输出从设备从设备:配置好相关寄存器---->写数据到SPI数据寄存器---->随着主设备输出的时钟脉冲同时将数据移位输出给主设备
由上可知,SPI的收发是同时进行的,这样就有一些问题需要解释:
1.主设备想读从设备的数据,先发命令,这好理解,直接将命令写到数据寄存器输出即可,但后面读数据的过程主设备应该发送什么?这个问题需要先明白SPI自己并不能支持数据读写这样的 *** 作,而是用户自己利用SPI接口扩展出来的功能,需要定制相关协议,对于读从设备数据,数据序列一般如下。主设备:命令字节1,命令字节2,...,命令字节N,任意数据1,任意数据2,...,任意数据M从设备收到命令字后知道是主设备读数据,就会忽略主设备后面发出的数据,直接将主设备需要读回的数据回传给主设备,主设备发任意数据1的时候从设备回所需读数据第一个字节,依次类推。需要注意的是,从设备必须在主设备发送任意数据1之前就把第一个字节写入SPI数据寄存器,否则主设备读到的数据会不对。
2.在主设备发数据的时候,如果从设备不写数据到SPI数据寄存器,主设备会不会收到数据?对于主设备,只要设置成收发同时进行的模式,就是不连从设备,一样可以收到数据,实际上是每输出一个时钟脉冲,主设备就会将SPI发送口设为相应状态,并从SPI接收口读一个状态放入接收移位寄存器,所以从设备不写数据到SPI数据寄存器,主设备依然可以收到数据。对于这种情况,从设备回传的数据内容不能确定,理论上讲应该是其SPI数据寄存器之前的内容。
3.有的SPI会支持FIFO、DMA等功能,这只是把软件的工作由硬件来完成,收发流程并没有什么不同。
4.你所说的空字节正确的称呼应该是哑元字节(dumy byte),意思是填充上来凑数的,没有表示任何实际意义。
STM8 SPI从模式在从配置里,SCK引脚用于接收到从主设备来的串行时钟。SPI_CR1寄存器中BR[2:0]的设置不影响数据传输速率。
置配步骤
1.选择CPOL和CPHA位来定义数据传输和串行时钟之间的相位关系(见图91)。为保证正确的数据传输,从设备和主设备的CPOL和CPHA位必须配置成相同的方式。
2.帧格式(MSB在前还是LSB在前取决于SPI_CR1寄存器中的LSBFIRST位)必须和主设备相同。
3.在使用硬件模式(参考从选择(NSS)脚管理部分)时,NSS引脚在字节传输的全部过程中都必须为低电平。在使用件模式时,设置SPI_CR2寄存器中的SSM位并清除SSI位。
4.清除MSTR位,设置SPE位,使相应引脚工作于SPI模式下。
在这个配置里,MOSI引脚是数据输入,MISO引脚是数据输出。
数据传输过程
数据字节被并行地写入发送缓冲器。
当从设备收到时钟信号时,发送过程开始。第一位数据发送到MOSI引脚上。余下的7位被装进移位寄存器。当发送缓冲器中的数据传输到移位寄存器时,TXE标志被置位。如果设置了SPI_ICR寄存器的TXEIE位,将会产生中断。
当数据传输完成时:
移位寄存器中的数据传送到接收缓冲器,RXNE标志被置位。
如果设置了RXEIE位,则产生中断。
在最后一个采样时钟边沿,RXNE位被置'1',移位寄存器中接收到的数据字节拷贝到接收缓冲器。读取SPI_DR寄存器得到这个缓冲值。读SPI_DR寄存器时,RXNE位被清除。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)