STM8 SPI的学习

发布者:qin199099最新更新时间:2018-06-18 来源: eefocus关键字:STM8  SPI 手机看文章 扫描二维码
随时随地手机看文章

#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
}

关键字:STM8  SPI 引用地址:STM8 SPI的学习

上一篇:STM32时钟代码的解析,以及启动函数的指针跳转
下一篇:STM32 system_stm32f10x.c文件分析

推荐阅读最新更新时间:2024-03-16 16:05

ARM7入门12,SPI通信
数码管显示1-F。 主程序: /******************************************************************************* *File: Main.c *功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制 *******************************************************************************/ #include config.h #define HC595_CS 0x00000100 /*P0.8口为74HC595的片选*/ uint8 rcv_d
[单片机]
ARM7入门12,<font color='red'>SPI</font>通信
STM8 HSI与HSE手动切换时钟源
实验平台:思修电子工作室 祥云小王子 开发版 int main(void) { PI_DDR_DDR0=1;//配置PI0端口为输出模式 PI_CR1_C10=1; //配置PI0端口为推挽输出模式 PI_CR2_C20=0; //配置PI0端口低速率输出 led1=1; //PI0输出为高电平,D1熄灭 while(1) { //************HSI- HSE时钟手动切换流程及注释说明************ //如果CLK_CMSR中的主时钟源为HSI,则CLK_CMSR=0xE1 //如果CLK_CMSR中的主时钟源为LSI,则CLK_CMSR=0xD2 //如果CLK_CMSR中的
[单片机]
STM8驱动HX711
普及:HX711AD一款专为高精度电子秤而设计的 24 位 A/D 转换器芯片; 获取数据方法:两个普通IO DOUT输入:GPIO_Mode_In_FL_No_IT; SCK输出:GPIO_Mode_Out_PP_Low_Slow; 输出口必须硬件上需接上拉电阻到电源,保证可以输出高电平,否则HX711芯片的数据口一直保持同样电平; 程序:官方例程: STM8例程: //IO配置 #define HX711_DOUT_GPIO GPIOC #define HX711_DOUT_PIN GPIO_Pin_1 #define HX711_DOUT_STATUS GPIO_ReadInputD
[单片机]
STM8串口初始化寄存器配置
//库函数配置 UART1_DeInit(); UART1_Init((u32)1000000, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO , UART1_SYNCMODE_CLOCK_DISABLE , UART1_MODE_TXRX_ENABLE); UART1_ITConfig(UART1_IT_RXNE_OR,ENABLE ); UART1_Cmd(ENABLE ); //寄存器配置 //UART1- CR1 |= 0X00; //UART1- CR3 |= 0X00; UART1- CR2 = 0X2C; UAR
[单片机]
基于ATMEGA8515的SPI驱动ST7565P液晶屏的程序
这是用SPI方式来驱动12864液晶的源程序,液晶屏的控制芯片为ST7565P经测试SPI的时钟可达到振荡频率的二分频。比用普通IO口模拟串行的方式快多了。。。 下面贴出源代码,有详细注释。。。。 本程序简单实用,可拿去作简单参考。。。。 编译环境:GCC+AVR STUDIO 单片机:ATMEGA 8515 晶振: 3.6864M #include avr/io.h //包含头文件 #include avr/pgmspace.h #define COMMAND 1 #define DATA 0 ///////////////////////////////////////// //数据线定义
[单片机]
STM32F0之SPI(使用固件库)
typedef struct { uint16_t SPI_Direction;//设置方向 (2线全双工、2线只接受、一线发送、一线接受) uint16_t SPI_Mode; //模式 (从或主设备) uint16_t SPI_DataSize; //宽度 (8或16位) uint16_t SPI_CPOL; //时钟极性 (低或高) uint16_t SPI_CPHA; //时钟相位 (第一个或第二个跳变沿) uint16_t SPI_NSS; //片选方式 (硬件或软件方式) uint16_t SPI_BaudRatePrescaler; //波特率预分频 (
[单片机]
STM32双机SPI中断通信机制
研究STM32F4的SPI有一阵子了,进步很缓慢,前几天终于鼓起勇气,用手抄了一遍官方的代码,然后自己一个字字的敲进去,然后再调试。历时大约一个星期,终于把SPI的中断发送和中断接收给整清楚了。在没有正确运行出结果之前,一切都是辣么痛苦。此文鼓励我继续往前进步。 先说主机端,首先当然是写SPI驱动文件,也就是SPI的配置,具体文件如下: SPI.c #include #include usart.h #include spi.h u8 Master_Temp =0; extern SPI_InitTypeDef SPI_InitStructure; u8 Slave_Temp=0; static
[单片机]
基于AT89C52单片机的SD卡的读写设计
   前言   长期以来,以Flash Memory为存储体的SD卡因具备体积小、功耗低、可擦写以及非易失性等特点而被广泛应用于消费类电子产品中。特别是近年来,随着价格不断下降且存储容量不断提高,它的应用范围日益增广。当数据采集系统需要长时间地采集、记录海量数据时,选择SD卡作为存储媒质是开发者们一个很好的选择。在电能监测以及无功补偿系统中,要连续记录大量的电压、电流、有功功率、无功功率以及时间等参数,当单片机采集到这些数据时可以利用SD作为存储媒质。本文主要介绍了SD卡在电能监测及无功补偿数据采集系统中的应用方案。    设计方案   应用AT89C52读写SD卡有两点需要注意。首先,需要寻找一个实现AT89C52单片机与
[安防电子]
基于AT89C52单片机的SD卡的读写设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved