历史上的今天
今天是:2025年02月20日(星期四)
2021年02月20日 | STM8S 硬件SPI驱动74HC595
2021-02-20 来源:eefocus
简介:一直对STM8S的硬件SPI感兴趣,但没有真正使用过,以往都是用IO口模拟,这次刚好有个板子上有两个595驱动的8位LED数码管,就在上面试了一把,把过程记录一下。
硬件接线图:

595是数据接收器件,所以MCU只用了3条线与之相连,分别是MOSI接SER,SCK接CLK,NSS接RCK。其实这里RCK可以用其他的IO口的。
相关的代码:
LOCAL uint8 DISP_BUF[8]={0,1,2,3,4,5,6,7}; //显示缓冲区
PUBLIC uint8 DISP_TAB[]= //显示码表
{
0x14,0xD7,0x4C,0x45,0x87,0x25,0x24,0x57,0x04,0x05,0x06,0xA4,0x3C
};
相关的IO口设为上拉输出
LOCAL void gpio_init(void)
{
GPIO_DeInit(GPIOC);
GPIO_Init(GPIOC,GPIO_PIN_5|GPIO_PIN_6,GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_DeInit(GPIOE);
GPIO_Init(GPIOE,GPIO_PIN_5,GPIO_MODE_OUT_PP_LOW_FAST);
}
SPI初始化
LOCAL void spi_init(void)
{
SPI_DeInit();
CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, ENABLE);
SPI_Init(SPI_FIRSTBIT_LSB, SPI_BAUDRATEPRESCALER_256, SPI_MODE_MASTER,SPI_CLOCKPOLARITY_LOW, SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_1LINE_TX, SPI_NSS_SOFT, 0x07);
SPI_Cmd(ENABLE);
}
显示程序
PUBLIC void DISP_Display(void)
{
uint8 i,dig = 0x80;
for (i=0;i<8;i++)
{
GPIO_WriteLow(GPIOE,GPIO_PIN_5);
while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
SPI_SendData(DISP_TAB[DISP_BUF[i]]);
while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
SPI_SendData(dig);
while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
GPIO_WriteHigh(GPIOE,GPIO_PIN_5);
delay(20);
dig >>= 1;
}
}
编译运行,出现的字符如下:

用示波器看了下,MOSI脚和SCK脚的波形正常。猜想是硬件SPI的速度太快,595跟不上。于是修改代码,在两次发送数据之后都延时一下。
PUBLIC void DISP_Display(void)
{
uint8 i,dig = 0x80;
for (i=0;i<8;i++)
{
GPIO_WriteLow(GPIOE,GPIO_PIN_5);
while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
SPI_SendData(DISP_TAB[DISP_BUF[i]]);
delay(500);
while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
SPI_SendData(dig);
delay(500);
while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
GPIO_WriteHigh(GPIOE,GPIO_PIN_5);
delay(20);
dig >>= 1;
}
}
再次编译运行,显示如下:

结论:
1. STM8S 硬件SPI的速度较快,实际应用的时候需要考虑外部设备的响应速度问题。
2. while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);只能保证每次SPI发送数据前,发送缓冲区是空的,即上次数据已经发送完成,但不能保证外部设备正确接收了数据。
史海拾趣
|
此开关电源属于复合式开关电源,采用TL431的精密基准和PC817组成反馈电路。整个工作过程:交流输入经滤波、整流后成为直流高压,再由功率开关管斩波、高频变压器降压后得到高频矩形波电压,最后经过输出整流滤波器,获得所需要的直流输出电压。此开 ...… 查看全部问答> |
|
中心议题: 如何简化[url=]开关[/url]电源设计解决方案: 性能评估电气仿真与热仿真测试原型电源设计的思路 过去15年来,开关电源的设计逐渐成为主流。现在,开关电源的设计已不再是专家的任务,任何参与系统设计的人员都能够最终设计出自己的开关 ...… 查看全部问答> |
|
在WinCE6.0操作系统上,用户如何注册自已的动态库(像XP系统上一样regsvr32.exe \\xxx\\XXX.dll )… 查看全部问答> |
|
这样的 线程A不停地malloc数据,通过PostThreadMessage()把数据块的指针发送给另外一个线程。 线程B while地GetMessage(),将数据块保存至文件,并free掉。 现在发现这样做的情况下,会发生内存泄露,后来我设置了一个变量,每次PostThreadMessa ...… 查看全部问答> |




