历史上的今天
今天是:2025年02月06日(星期四)
2020年02月06日 | STM8 SPI的学习
2020-02-06 来源:eefocus
#define SPI_CS_PORT GPIOC
#define SPI_CS_PIN GPIO_PIN_4
#define SPI_CLK_PORT GPIOC
#define SPI_CLK_PIN GPIO_PIN_5
#define SPI_MOSI_PORT GPIOC
#define SPI_MOSI_PIN GPIO_PIN_6
#define SPI_MISO_PORT GPIOC
#define SPI_MISO_PIN GPIO_PIN_7
SPI是串行设备接口(Serial Peripheral Interface)的英文缩写,是一种单主多从式的全双工同步串行通信协议。
SCK:同步时钟信号线
可调整数据比特流。主设备可在不同的波特率下传输数据。
MOSI:主机发送从机接受的数据线。
数据从SPI总线的主设备输出,然后从SPI的从设备输入。
MISO:从机发送主机接收的数据线
与上面的相反
CS:主从机通讯同步的控制信号线。
让设备可以单独与特定的从设备通讯,避免数据线上的冲突。
按照串行通信位顺序,有MSB和LSB两种通信方式。
MSB是Most Significant Bit 的缩写,意为最高有效位。
先传输高位,后传输低位。
LSB(Least Significant Bit),意为最低有效位。
先传输低位,后传输高位。
GPIO_Init(SPI_CS_PORT, SPI_CS_PIN, GPIO_MODE_OUT_PP_HIGH_SLOW); //CS
推免输出高低速
GPIO_Init(SPI_CLK_PORT, SPI_CLK_PIN, GPIO_MODE_OUT_PP_LOW_FAST); //CLK
推免输出低高速
GPIO_Init(SPI_MOSI_PORT, SPI_MOSI_PIN, GPIO_MODE_OUT_PP_HIGH_FAST); //MOSI
推免输出高高速
GPIO_Init(SPI_MISO_PORT, SPI_MISO_PIN, GPIO_MODE_IN_FL_NO_IT); //MISO
浮空输入无中断
配置步骤:
1、通过SPI_CR1寄存器的BR[2:0]位定义串行时钟波特率。
2、选择CPOL和CPHA位,定制数据传输和串行时钟间的相位关系。
3、配置SPI_CR1寄存器的LSBFIRST位定义帧格式。
4、硬件模式下,在数据帧的全部传输过程中应把NSS脚连接到高电平;
在软件模式下,需设置SPI_CR2寄存器的SSM和SSI位为1.
5、必须设置MSTR和SPE位(只当NSS脚被连到高电平,这些位才能保持为1)。
STM8应用程序通过3个状态标志位来监控SPI总线的状态。
1、总线忙(Busy)标志
当它被置1时,表明SPI正忙于通信。发送/接收完一个字后,BUSY标志立即清除,此标志由硬件设置和清楚。监视此标志可以避免写冲突错误。写此标志无效。仅当SPE位被置1时此标志才有意义。
2、发送缓冲器空标志(TXE)
此标志被置1是表明发送缓冲器为空。当发送缓冲器有一个待发送的数据时,TXE标志被清楚。
3、接收缓冲器非空(RXNE)
此标志为1时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清楚此标志。
关闭SPI
清楚SPE位即可关闭SPI。
SPI中断
STM8S系列单片机的SPI具有6个中断事件,
事件标志 使能控制位
1、发送缓冲器空标志 TXE TXEIE
2、接收缓冲器非空标志 RXNE RXNEIE
3、唤醒事件标志 WKUP WKIE
4、主模式错误事件 MODF
5、溢出错误 OVR
6、CRC错误标志 CRCERR ERRIE
相关功能寄存器
1、SPI控制寄存器1(SPI_CR1)
2、SPI控制寄存器1(SPI_CR2)
3、中断控制寄存器(SPI_ICR)
4、SPI状态寄存器(SPI_SR)
5、SPI数据寄存器(SPI_DR)
6、SPI_CRC多项式寄存器(SPI_CRCPR)
void spi_flash_init(void)
{
/* spi pin init */
GPIO_Init(SPI_CS_PORT, SPI_CS_PIN, GPIO_MODE_OUT_PP_HIGH_SLOW); //CS
GPIO_Init(SPI_CLK_PORT, SPI_CLK_PIN, GPIO_MODE_OUT_PP_LOW_FAST); //CLK
GPIO_Init(SPI_MOSI_PORT, SPI_MOSI_PIN, GPIO_MODE_OUT_PP_HIGH_FAST); //MOSI
GPIO_Init(SPI_MISO_PORT, SPI_MISO_PIN, GPIO_MODE_IN_FL_NO_IT); //MISO
SPI_CS_DISABLE;
SPI_DeInit();
SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_MODE_MASTER,
SPI_CLOCKPOLARITY_HIGH, SPI_CLOCKPHASE_2EDGE, SPI_DATADIRECTION_2LINES_FULLDUPLEX, SPI_NSS_SOFT, 0);
SPI_ITConfig(SPI_IT_TXE, DISABLE);
SPI_ITConfig(SPI_IT_RXNE, DISABLE);
SPI_Cmd(ENABLE);
#if SPI_FLASH_TEST
test_spi_flash();
#endif
}
#define SPI_CS_DISABLE SET_PIN_H(SPI_CS_PORT,SPI_CS_PIN)
void SPI_DeInit(void)
{
SPI->CR1 = SPI_CR1_RESET_VALUE;//状态寄存器配置
SPI->CR2 = SPI_CR2_RESET_VALUE;
SPI->ICR = SPI_ICR_RESET_VALUE;//中断寄存器配置
SPI->SR = SPI_SR_RESET_VALUE; //状态寄存器配置
SPI->CRCPR = SPI_CRCPR_RESET_VALUE;//CRC多项式寄存器 复位值07
}
下一篇:STM8S串口中断卡死调试记录
史海拾趣
|
windows7,VC2005编译的张帆《驱动程序开发详解》的例子不能安装 编译能够成功,我把HelloWDM.inf拷到HelloWDM.sys目录下,使用EzDriverInstaller安装的时候最后总是无法成功,提示: the driver was enable successfully。 用Windows硬件管理器来手动安装。也一样的无法成功安装? 请问是和缘故? 谢谢… 查看全部问答> |
|
求介绍DSP具体型号 我的需求如下: 1.主频50M+; 2.ADC通道数8+,精度8-12位(最好可调,像MSP430),内阻希望尽量高点,因为我是要用分压法测电阻的,被测电阻阻值为100M--10K; 速度希望能有4Msps+; 3.I/O口数量50+个; 4.通 ...… 查看全部问答> |
|
DSP调试总结 1.warning: entry point symbol _c_int00 undefined 使用C写DSP时,在rts.lib库中定义了入口地址:_c_int00而使用汇编语言编程,就不用包括rts.lib库,所以入口地址及其标号可以由人工指定。而使用C时,就不同了,必须从rts.li ...… 查看全部问答> |
|
本帖最后由 木子鱼 于 2014-11-16 14:13 编辑 第一种方法: 使用Boot下载用户程序: (根据用户手册操作:在Boot菜单选择1,之后选择Transfer 下拉菜单的 Send Ymodem ,在弹出菜单选择要下载 ...… 查看全部问答> |




