STM8 SPI通讯程序
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位被清除。
其实两种通讯模式都是串行通信,通讯协议可以相同的。但是I2c与spi首先是硬件上的接口就不相同,spi上有个控制的引脚,要拉高或者放低来使能通讯与否,还有data和clk,最少三根线来通信。iic是两个线就可以通讯了,data和clk来实现通讯。
传送while(1)
{
a=0b10101010;
SPI_CR2 = 0b00000011;//0X03;
SPI_CR1 = 0b01001100;//0X4C; //8MHZ (HSE = 16MHZ)
while(1)
{
//while(!TXE);
for(sendCnt=0;sendCnt<8;sendCnt++)
{
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口自己设一下
印史甲硝: 传送 while(1) { a=0b10101010; SPI_CR2 = 0b00000011;//0X03; SPI_CR1 = 0b01001100;//0X4C; //8MHZ (HSE = 16MHZ) while(1) {//while(!TXE); for(sendCnt=0;sendCnt{ while((SPI_SR&0b00000010)==0b00000010) SPI_DR = 0xAA; if((SPI_SR...
松原市13467606250: stm8 SPI怎么连接 - ?
印史甲硝: STM8 SPI从模式 在从配置里,SCK引脚用于接收到从主设备来的串行时钟.SPI_CR1寄存器中BR[2:0]的设置不影响数据传输速率. 置配步骤 1.选择CPOL和CPHA位来定义数据传输和串行时钟之间的相位关系(见图91).为保证正确的数据传...
松原市13467606250: stm8 SPI怎么连接 - ?
印史甲硝: 这个单片机我没用过,但是SPI的连接方法应该都差不多吧——主机的DI连从机的DO,主机的DO连从机的DI,时钟线直接连,另外用主机的随便一个I/O口作为从机的片选,每次开始通信时先使能片选线.还...
松原市13467606250: 两个stm8芯片如何实现spi收发 - ?
印史甲硝: SLAVE是不用主动进行操作的我没用过STM32,不过可以从SPI接口的原理来解释一下,一般都是按我说的方式工作SPI需要设为MASTER/SLAVE,而且必须一方为主,另一方为从,同步的时钟信号由主设备输出,从设备根据主设备给出的时...
松原市13467606250: 51单片机怎样实现SPI通讯 - ?
印史甲硝: 用传统的51单片机实现SPI通讯,需要用I/O脚来模拟SPI协议,这比较麻烦. 选用STC8系列单片机,就具有了SPI接口了 ,只需要对寄存器操作就行了.方便了很多了.如下图,这是STC8系列中的4个子系列,还有其它的子系列,就不再列举了.
松原市13467606250: stm8写好一个spi驱动怎么测试是否可用 - ?
印史甲硝: 单线半双方模式通过设置USART_CR3寄存器的HDSEL位选择.在这个模式里,下面的位必须保持清零状态: ● USART_CR2寄存器的LINEN和CLKEN位 ● USART_CR3寄存器的SCEN和IREN位 USART可以配置成遵循单线半双工协议.在单线...
松原市13467606250: STM32与STM8进行通信 - ?
印史甲硝: 都可以,当然,USART是最简单了.只要波特率,等的串口参数是一致的就行了.SPI,i2c要设置主从机.
松原市13467606250: stm8L101F3系列SPI通信,busy位置1后怎么清0 ??? - ?
印史甲硝: 没用过,顶一下
松原市13467606250: 哪位大神会写stm8的C语言通信程序 - ?
印史甲硝: 现在几乎所有的单片机都能用C语言编程了,采用C语言编程确实能带来很多好处,至少可读性比汇编语言强多了.在STM8的开发环境中,可以通过新建一个工程,自动地建立起一个C语言的框架,生成后开发环境会自动生成2个C语言的程序,一个是main.c,另一个是stm8_interrupt_vector.c.main.c中就是一个空的main()函数
松原市13467606250: 关于调试stm32和stm8的i2c和spi协议的之间的区别 - ?
印史甲硝: 其实两种通讯模式都是串行通信,通讯协议可以相同的.但是I2c与spi首先是硬件上的接口就不相同,spi上有个控制的引脚,要拉高或者放低来使能通讯与否,还有data和clk,最少三根线来通信.iic是两个线就可以通讯了,data和clk来实现通讯.