打印
[STM8]

STM8S 硬件SPI驱动74HC595

[复制链接]
330|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alvpeg|  楼主 | 2023-12-30 22:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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]);

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]);


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


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

1436

帖子

0

粉丝