初级会员

- 积分
- 99
- 金钱
- 99
- 注册时间
- 2018-7-1
- 在线时间
- 76 小时
|
50金钱
代码是级联4片74HC595芯片点亮LED灯,这份代码偶尔能够控制下芯片,但是大部分时间都有BUG(所有IO只输出0 ),调了3天了完全没头绪了,本来以为简单的小东西,哎实在搞不定,代码贴下面了。
#define SHCP_GPIO_PORT (GPIOA)
#define SHCP_GPIO_PIN (GPIO_PIN_5)
#define DS_GPIO_PORT (GPIOA)
#define DS_GPIO_PIN (GPIO_PIN_6)
#define STCP_GPIO_PORT (GPIOE)
#define STCP_GPIO_PIN (GPIO_PIN_10)
#define HC595_SHCP_Low() HAL_GPIO_WritePin(SHCP_GPIO_PORT, SHCP_GPIO_PIN, GPIO_PIN_RESET)
#define HC595_SHCP_High() HAL_GPIO_WritePin(SHCP_GPIO_PORT, SHCP_GPIO_PIN, GPIO_PIN_SET)
#define HC595_STCP_Low() HAL_GPIO_WritePin(STCP_GPIO_PORT, STCP_GPIO_PIN, GPIO_PIN_RESET)
#define HC595_STCP_High() HAL_GPIO_WritePin(STCP_GPIO_PORT, STCP_GPIO_PIN, GPIO_PIN_SET)
#define HC595_Data_Low() HAL_GPIO_WritePin(DS_GPIO_PORT, DS_GPIO_PIN, GPIO_PIN_RESET)
#define HC595_Data_High() HAL_GPIO_WritePin(DS_GPIO_PORT, DS_GPIO_PIN, GPIO_PIN_SET)
void HC595_Send_Byte(uint8_t byte);
void HC595_CS(void);
void HC595_Send_Multi_Byte(uint8_t *data, uint16_t len);
void LedRowOut(uint32_t Data);
/***
*74HC595 发送一个字节
*即往74HC595的DS引脚发送一个字节
*/
void HC595_Send_Byte(uint8_t byte)
{
uint8_t i;
HC595_STCP_Low(); // 将STCP拉低
for (i = 0; i < 8; i ++) //一个字节8位,传输8次,一次一位,循环8次,刚好移完8位
{
/**** 步骤1:将数据传到DS引脚 ****/
HC595_SHCP_Low(); // SHCP拉低
HAL_Delay(2);
if(byte & 0x80) //先传输高位,通过与运算判断第八是否为1
{
HC595_Data_High(); //如果第八位是1,则与 595 DS连接的引脚输出高电平
}
else //否则输出低电平
{
HC595_Data_Low();
}
byte <<= 1; // 左移一位,将低位往高位移,通过 if (byte & 0x80)判断低位是否为1
/*** 步骤2:SHCP每产生一个上升沿,当前的bit就被送入移位寄存器 ***/
HAL_Delay(2);
HC595_SHCP_High(); // SHCP拉高, SHCP产生上升沿
HAL_Delay(2); // 适当延时
HC595_SHCP_Low(); // SHCP拉低
}
}
/**
*74HC595输出锁存 使能
**/
void HC595_CS(void)
{
HC595_STCP_Low(); // 将STCP拉低
HAL_Delay(5); // 适当延时
HC595_STCP_High(); // 再将STCP拉高,STCP即可产生一个上升沿
HAL_Delay(5); // 适当延时
HC595_STCP_Low(); // 将STCP拉低
}
/**
*发送多个字节
*便于级联时数据的发送
*级联N级,就需要发送N个字节控制HC595
***/
void LedRowOut(uint32_t Data)
{
//printf("LedRowOut == %#x\r\n",Data);
HC595_Send_Byte(Data >> 24);
HC595_Send_Byte(Data >> 16);
HC595_Send_Byte(Data >> 8);
HC595_Send_Byte(Data >> 0);
HC595_CS();
}
void LED_MspInit(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOE时钟
__HAL_RCC_GPIOE_CLK_ENABLE(); //开启GPIOE时钟
GPIO_Initure.Pin= GPIO_PIN_5|GPIO_PIN_6;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_NOPULL; //不输出
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin= GPIO_PIN_10;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_NOPULL; //不输出
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOE,&GPIO_Initure);
HAL_GPIO_WritePin(SHCP_GPIO_PORT, SHCP_GPIO_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(STCP_GPIO_PORT, STCP_GPIO_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(DS_GPIO_PORT, DS_GPIO_PIN, GPIO_PIN_SET);
LedRowOut(LEDALL);//关灯
HC595_CS();
}
原理图在这里,原理图我就不吐槽了,硬件有问题,哎不多说了(Q2 Q3 Q4电源没加)。而且这个芯片,他搞在了灯板上面。从主板拉了10cm 排线过去灯板(不知道是不是这个问题)。而且原理图I/O硬件搞错了,上面写着是SPI。。实际上I/O搞错只能用模拟的串行协议。
|
-
-
最佳答案
查看完整内容[请看2#楼]
对 应该用5V供电,我是MR脚的上拉有问题 电阻小一点就好了。电压是2.0V左右 TTL 2.5V才是高 晕了。手册写着是3.3V供电。 时序是OK的
|