STM8 SPI通讯程序

STM8 SPI通讯程序,第1张

传送

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位被清除。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11158173.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存