如题,为什么要这样做?
最近做的一个项目上使用了74HC595作为指示灯板使用;
这个灯板与驱动板是通过排线连接,排线约25cm长;
在实验室测试一切正常,发到客户手上使用就出现了某个LED跳动情况;
跳动原因:传输线收到干扰。
这种显示方式抗干扰能力非常差且没有校验功能,满足不了需求;
因为传输线是必须要有的,所以只能通过增加校验的方式来处理干扰。
解决方法:
- 指示灯板增加MCU;
- 驱动板与灯板改为UART通讯增加校验功能;
因为驱动板与灯板连接的IO口没有UART外设功能,只能通过软件模拟UART使用;
代码
代码来自于:发个软件UART代码吧 (amobbs.com 阿莫电子技术论坛)
#include "SimComIO.h"
#include <string.h>
//为了提高接收的准确率和纠错性能,采用3倍采样率,定时中断的频率是波特率的3倍。例如:需要波特率9600bps的话,需要1/(9600*3)=34.72us的定时中断。
//#define SC_RXD 6
//#define SC_RXD_SET_INPUT() {DDRD&=(~BIT(SC_RXD));}
//#define SC_RXD_GET() ((PIND&(BIT(SC_RXD))))
#define SC_RXD_GET() (HAL_GPIO_ReadPin(SIM_UART_RX_GPIO_Port, SIM_UART_RX_Pin))
//#define SC_TXD 7
//#define SC_TXD_0() {PORTD&=(~BIT(SC_TXD));}
//#define SC_TXD_1() {PORTD|=BIT(SC_TXD);}
//#define SC_TXD_SET_OUTPUT() {DDRD|=BIT(SC_TXD);}
#define SC_TXD_0() {HAL_GPIO_WritePin(SIM_UART_TX_GPIO_Port, SIM_UART_TX_Pin, GPIO_PIN_RESET);}
#define SC_TXD_1() {HAL_GPIO_WritePin(SIM_UART_TX_GPIO_Port, SIM_UART_TX_Pin, GPIO_PIN_SET);}
uint8_t sc1_rxd_scan_ct=0;
uint8_t sc1_rxd_scan_next_time=0;
uint8_t sc1_rxd_scan_step=0;
uint8_t sc1_rxd_dat;
uint8_t sc1_rxd_ready=0;
uint8_t sc1_rxd_tmpdat;
volatile uint8_t sc_txd_ready=0;//模拟串口变量
volatile uint8_t sc_txd_bit_pt=0;
volatile uint8_t sc_txd_data=0;
volatile uint8_t sc_txd_ct=0;
// typedef sim_uart_def{
// uint8_t sc1_rxd_scan_ct;
// uint8_t sc1_rxd_scan_next_time;
// uint8_t sc1_rxd_scan_step;
// uint8_t sc1_rxd_dat;
// uint8_t sc1_rxd_ready;
// uint8_t sc1_rxd_tmpdat;
// uint8_t sc_txd_ready;//模拟串口变量
// uint8_t sc_txd_bit_pt;
// uint8_t sc_txd_data;
// uint8_t sc_txd_ct;
// }TYPE_SIM_UART_DEF;
// TYPE_SIM_UART_DEF su1,su2,su3,su4,su5,su6;
// void


7453

被折叠的 条评论
为什么被折叠?



