OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2445|回复: 8

有没大佬帮我看一下这份代码有没有问题

[复制链接]

36

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-7-1
在线时间
76 小时
发表于 2020-7-1 17:45:19 | 显示全部楼层 |阅读模式
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搞错只能用模拟的串行协议。

微信截图_20200701174114.png
微信截图_20200701174104.png

最佳答案

查看完整内容[请看2#楼]

对 应该用5V供电,我是MR脚的上拉有问题 电阻小一点就好了。电压是2.0V左右 TTL 2.5V才是高 晕了。手册写着是3.3V供电。 时序是OK的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-7-1
在线时间
76 小时
 楼主| 发表于 2020-7-1 17:45:20 | 显示全部楼层
csmjmcc 发表于 2020-7-2 08:58
MCU供电是3.3V,而595应该是5V,你用推挽输出,估计输出电平不匹配。

对 应该用5V供电,我是MR脚的上拉有问题 电阻小一点就好了。电压是2.0V左右 TTL 2.5V才是高 晕了。手册写着是3.3V供电。 时序是OK的
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5141
金钱
5141
注册时间
2014-8-26
在线时间
1317 小时
发表于 2020-7-1 18:41:59 | 显示全部楼层
帮顶。。。
回复

使用道具 举报

11

主题

131

帖子

0

精华

高级会员

Rank: 4

积分
757
金钱
757
注册时间
2020-5-11
在线时间
71 小时
发表于 2020-7-1 19:50:42 | 显示全部楼层
顶顶顶顶
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-7-2 08:51:33 | 显示全部楼层
大佬没时间看
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2020-7-2 08:58:57 | 显示全部楼层
MCU供电是3.3V,而595应该是5V,你用推挽输出,估计输出电平不匹配。
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2020-7-3 07:52:32 | 显示全部楼层
哈哈,怎么自己拿分?要不要我送点分给你?
回复

使用道具 举报

36

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-7-1
在线时间
76 小时
 楼主| 发表于 2020-7-3 11:44:24 | 显示全部楼层
csmjmcc 发表于 2020-7-3 07:52
哈哈,怎么自己拿分?要不要我送点分给你?

我自己解决了啊,MR脚上拉问题 和你这个有关系吗?
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2020-7-3 13:55:18 | 显示全部楼层
Hatcher36029135 发表于 2020-7-3 11:44
我自己解决了啊,MR脚上拉问题 和你这个有关系吗?

你板子若有上拉电阻,则建议你不要将IO设置成推挽,而是设置成开漏。另外,是谁解决问题不重要,关键是倾听的态度,那分数又不是银子,这也舍不得表达谢意?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 07:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表