历史上的今天
返回首页

历史上的今天

今天是: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发送数据前,发送缓冲区是空的,即上次数据已经发送完成,但不能保证外部设备正确接收了数据。

推荐阅读

史海拾趣

FARNELL公司的发展小趣事

FARNELL公司成立于1937年,由创始人在英国利兹创建。起初,公司专注于电子元器件的分销,凭借其优质的产品和可靠的供货能力,逐渐在电子行业中崭露头角。在那个时代,电子产品正处于快速发展阶段,FARNELL公司凭借其前瞻性的市场洞察力和灵活的供应策略,赢得了众多客户的信赖。

台湾町洋(dinkle)公司的发展小趣事

町洋公司创立于1983年,由一群志同道合的电子工程师创立。创业初期,町洋专注于接线端子及相关产品的研发与生产,凭借其独特的设计理念和精湛的生产工艺,逐渐在台湾市场上崭露头角。公司创始人深知产品质量的重要性,因此始终坚持严格的品质控制,赢得了客户的信赖。

Anaheim Automation公司的发展小趣事

2005年,AMOTECH被Deloitte评为“亚太技术500强”,这进一步提升了公司在国际上的知名度和影响力。同年,公司还获得了ISO14001认证,这体现了公司对环境保护的重视和承诺。随着业务的不断拓展,AMOTECH在2006年和2008年分别建立了青岛办公室和韩国第四工厂,进一步提升了公司的产能和效率。

台湾凯励(Carli)公司的发展小趣事

凯励公司始终将技术创新作为发展的核心驱动力。公司不断投入研发资金,加强与高校和研究机构的合作,不断推出具有竞争力的新产品。例如,公司成功研发出了MPX、MTF、MTB等多个系列的金属膜电容器,这些产品不仅具有优异的性能和稳定性,还广泛应用于新能源、工业控制、通信等领域。此外,凯励公司还致力于产品升级和工艺改进,不断提高产品的可靠性和使用寿命。

Cotco公司的发展小趣事

为了提升竞争力,Cotco公司高度重视技术创新和产品研发。公司投入大量资金建立了先进的研发中心,吸引了一批顶尖的电子工程师和研发人员。通过不断的技术攻关和市场调研,Cotco成功开发出一系列具有自主知识产权的电子产品,包括高性能的电源适配器、稳定可靠的数据线等。这些产品凭借卓越的性能和合理的价格,迅速在市场上占据了一席之地。

Hammond公司的发展小趣事

面对电子行业日新月异的变化和不断涌现的新挑战,Cotco公司始终保持敏锐的市场触觉和应变能力。公司及时调整战略方向,加大在新兴领域如物联网、智能家居等的投入和研发力度。同时,Cotco也积极拓展国际市场,与全球多个国家和地区的合作伙伴建立合作关系,推动产品的全球化销售和服务。展望未来,Cotco将继续秉承创新、质量和服务的理念,致力于成为全球电子行业的佼佼者。

问答坊 | AI 解惑

失真度测试的一种解决方案

大家共同学习,这里提供一种失真度测试仪的一种简单解决方案…

查看全部问答>

帮忙具体分析一下这个开关电源

此开关电源属于复合式开关电源,采用TL431的精密基准和PC817组成反馈电路。整个工作过程:交流输入经滤波、整流后成为直流高压,再由功率开关管斩波、高频变压器降压后得到高频矩形波电压,最后经过输出整流滤波器,获得所需要的直流输出电压。此开 ...…

查看全部问答>

如何简化开关电源设计

中心议题: 如何简化[url=]开关[/url]电源设计解决方案: 性能评估电气仿真与热仿真测试原型电源设计的思路 过去15年来,开关电源的设计逐渐成为主流。现在,开关电源的设计已不再是专家的任务,任何参与系统设计的人员都能够最终设计出自己的开关 ...…

查看全部问答>

基于Windows CE的嵌入式数字地形测图系统开发.pdf

基于Windows CE的嵌入式数字地形测图系统开发.pdf…

查看全部问答>

在WinCE6.0操作系统上,用户如何注册自已的动态库

在WinCE6.0操作系统上,用户如何注册自已的动态库(像XP系统上一样regsvr32.exe \\xxx\\XXX.dll )…

查看全部问答>

wince下的thread message丢失问题?

这样的 线程A不停地malloc数据,通过PostThreadMessage()把数据块的指针发送给另外一个线程。 线程B while地GetMessage(),将数据块保存至文件,并free掉。 现在发现这样做的情况下,会发生内存泄露,后来我设置了一个变量,每次PostThreadMessa ...…

查看全部问答>

EVC 开发 设计提示声音

我现在设计串口数据采集程序,希望每次数据采集完后能发出想MESSAGEBOX弹出的提示声音,请教各位该如何设计?…

查看全部问答>

www.kingofcoder.com --- 编程文章网

www.kingofcoder.com --- 编程文章网 …

查看全部问答>

求助啊

最近搞这个LPCXpresso这个软件,发现要自己添加头文件的,麻烦啊,不知哪位有关于LPC1343的一些头文件库,可否共享一下,谢谢…

查看全部问答>