历史上的今天
返回首页

历史上的今天

今天是:2025年06月18日(星期三)

正在发生

2018年06月18日 | STM8 SPI的学习

2018-06-18 来源: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
}

推荐阅读

史海拾趣

BERGQUIST公司的发展小趣事

面对日益严峻的环境问题和可持续发展的挑战,BERGQUIST公司始终坚持绿色发展的理念。公司不断投入研发力量,开发环保型热管理材料和生产工艺。同时,公司还积极推广节能减排技术,努力降低生产过程中的能耗和排放。这些举措不仅符合社会发展趋势,也为公司的可持续发展提供了有力保障。

这五个故事从不同角度展示了BERGQUIST公司在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。这些事实性的描述旨在客观呈现BERGQUIST公司的历史与现状,不含任何褒贬之意。

Belkin公司的发展小趣事

在发展过程中,贝尔金也通过收购其他公司来增强自身实力。例如,2013年贝尔金正式完成对Linksys的收购,这一举措进一步丰富了其产品线,并加强了在网络设备领域的竞争力。此外,贝尔金还通过不断整合内部资源,优化生产流程,提高产品质量和效率。

B.B. Battery公司的发展小趣事

面对日益严峻的环境问题,B.B. Battery公司积极响应国家绿色发展的号召,致力于推动绿色生产。他们引进环保型生产设备和技术,减少生产过程中的污染物排放。同时,公司还研发出多款环保型电池产品,为客户提供更加绿色、高效的能源解决方案。这些举措不仅提升了公司的社会责任感,也为公司的可持续发展奠定了坚实基础。

Datakey Electronics公司的发展小趣事

Datakey Electronics公司自创立之初,就深知技术创新的重要性。在面临激烈市场竞争的情况下,公司投入大量资源进行研发,成功推出了一款具有革命性意义的数据存储产品。这款产品以其高可靠性、大容量和易用性迅速赢得了市场的认可,使Datakey Electronics在数据存储领域崭露头角。

ERGOBAHCO公司的发展小趣事

在快速发展的同时,ERGOBAHCO公司始终不忘履行社会责任和推动可持续发展。公司积极参与社会公益事业,捐款捐物支持贫困地区的教育、医疗等事业。同时,ERGOBAHCO公司还注重环保和节能减排工作,通过引进先进的环保技术和设备,实现了生产过程的绿色化、低碳化。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

Davies Molding公司的发展小趣事

Davies Molding公司在发展过程中,始终注重市场布局与拓展。公司不仅在美国中西部建立了稳固的市场地位,还积极开拓国际市场,将产品出口到全球多个国家和地区。通过与全球客户的合作,Davies Molding公司不仅提升了品牌影响力,还获得了更多的发展机遇。

问答坊 | AI 解惑

NECD78F1023资料 大赛可能会用到

本帖最后由 paulhyde 于 2014-9-15 09:13 编辑 我也是听说NEC大赛会用到这个而已~ 找来共享了,这东西貌似不好找。 [ 本帖最后由 虚V界 于 2009-8-31 14:51 编辑 ]  …

查看全部问答>

三极管作为开关电路的工作原理

请教下这个电路中两个三极管的工作原理是什么呢? 希望大虾不吝赐教,小弟多谢了!…

查看全部问答>

activesync

我的设备怎么与电脑链接三个小时左右就会自动断呢,而且怎么都连不上了除非重新启动,我用串口发送数据给设备,设备也不能正常接收了,但是我把u口拔插电脑时,通过电脑串口接收到的串口信息又是对的,实在是分析不出哪里的原因,愿大侠分析下,谢 ...…

查看全部问答>

全局变量地址引用错误,有谁清楚请教下。

我在该全局变量所在文件中使用正确,在另一个文件中访问错误,后发现在其他文件中该全局变量访问自己的成员变量时位移了4个字节,有谁遇到过这种情况,请教下。谢谢。…

查看全部问答>

s3c2440摄像头驱动

开发平台:三星s3c2440  Linux 功能:摄像头驱动 下载地址:http://www.itxxh.cn/Down/view.asp?id=23…

查看全部问答>

示波器V2.0最新的问题

1、接液晶的FPC座(54PIN,0.5mm)不知道被谁帮了个忙,卡被弄坏了,这个液晶的接口是插座形式的,根本焊不上去,跑了一下电子市场,发现根本没有这东西,这地方也太不发达了! 2、CIII starter板上的FPGA芯片特别烫,至少70度,倒还能够下载程序 ...…

查看全部问答>

LM3s串口通讯参数设置数据第九位能不能设置为MARk?

请教各位同仁:        串行通讯一般都设置为:波特率值,一个起始位,8个数据位,一个奇偶校验位,一个停止位。 其中数据第九位(奇偶校验位)在很多单片机(例如51)中可以设置成none,space,mark等。在LM3s上数 ...…

查看全部问答>

proteus仿真问题

proteus仿真串口通讯时,怎么设置串口助手呢?哪位大侠能解答一下呢,万分感谢!…

查看全部问答>