你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用STM32CubeMX 工程中,SPI操作MAX7219 遇到问题了

[复制链接]
select326 提问时间:2017-8-22 14:07 /
本帖最后由 select326 于 2017-8-22 14:10 编辑

STM32F103C8T6核心板,MAX7219点阵模块,STM32CubeMX 生成工程,并配置SPI1为Transmit Only Master ,配置PA4 为 GPIO_output 模式是open drain

max7219有一段51的例子代码,
//功能:向MAX7219(U3)写入字节
//入口参数:DATA
//出口参数:无
//说明:
void Write_Max7219_byte(uchar DATA)         
{
            uchar i;   
                Max7219_pinCS=0;               
            for(i=8;i>=1;i--)
          {                  
            Max7219_pinCLK=0;
            Max7219_pinDIN=DATA&0x80;
            DATA=DATA<<1;
            Max7219_pinCLK=1;
           }                                 
}
//-------------------------------------------
//功能:向MAX7219写入数据
//入口参数:address、dat
//出口参数:无
//说明:
void Write_Max7219(uchar address,uchar dat)
{
     Max7219_pinCS=0;
         Write_Max7219_byte(address);           //写入地址,即数码管编号
             Write_Max7219_byte(dat);               //写入数据,即数码管显示数字
         Max7219_pinCS=1;                        
}

void Init_MAX7219(void)
{
Write_Max7219(0x09, 0x00);       //译码方式:BCD码
Write_Max7219(0x0a, 0x03);       //亮度
Write_Max7219(0x0b, 0x07);       //扫描界限;8个数码管显示
Write_Max7219(0x0c, 0x01);       //掉电模式:0,普通模式:1
Write_Max7219(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0
}


这个在51上运行是没有问题的。

以下是我改写的,请大神们指点:

void max7219_init(void){
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
        uint8_t cmd[]={0x09,0x00,0x0a,0x03,0x0b,0x07,0x0c,0x01,0x0f,0x00};
        int mi=0;
        for(mi=0;mi<10;mi++){
                HAL_SPI_Transmit(&hspi1,&cmd[mi],1,1000);
        }

        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
}

while(1){
                HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);

                for( j=0;j<3;j++){
                        for( i=0;i<8;i++){
                                command[0] = i;
                                command[1] = dp[j];
                                HAL_SPI_Transmit(&hspi1,&command[0],1,1000);
                                HAL_SPI_Transmit(&hspi1,&command[1],1,1000);
                        }  
                                HAL_Delay(1000);
                }
                        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);


}

现在这段代码的表现是64个LED全亮,然后就没变化 了。
正确的应该是显示 1,2,3
求指点问题所在 ,谢谢


<
收藏 1 评论13 发布时间:2017-8-22 14:07

举报

13个回答
zhoupxa 回答时间:2017-8-22 14:39:34
有两个问题:
1.楼主是用GPIO模拟SPI驱动MAX7219吧?那么只需要把SPICS、SPICLK、SPIMOSI初始化为GPIO OUTPUT就行了,和MCU片上外设SPI1无关;
2.没看到主函数的初始化部分,必须正确初始化系统、外设时钟,MCU才能正常工作。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

select326 回答时间:2017-8-22 15:33:34
zhoupxa 发表于 2017-8-22 14:39
有两个问题:
1.楼主是用GPIO模拟SPI驱动MAX7219吧?那么只需要把SPICS、SPICLK、SPIMOSI初始化为GPIO OUTP ...

我是想使用MCU硬件SPI,而不是使用模拟SPI。
初始化只是把max7219_init 调了下。
select326 回答时间:2017-8-23 09:25:41
大神们,紧急求助啊
回答时间:2017-8-23 10:05:35
楼主, HAL_SPI_Transmit(&hspi1,&cmd[mi],1,1000);这里可以直接传输8个字符。但是从上面51的代码来看,应该是发送地址、命令。这样应该是两个字节两个自己的发送。
select326 回答时间:2017-8-23 13:08:34
安 发表于 2017-8-23 10:05
楼主, HAL_SPI_Transmit(&hspi1,&cmd[mi],1,1000);这里可以直接传输8个字符。但是从上面51的代码来看,应 ...

那这个地方我需要怎么改呢??求指点
回答时间:2017-8-23 14:01:27
每次发送的时候直接选择传输2个字节,然后测试一下效果。如果还不行,借助示波器看一下波形,是哪儿出的问题。
select326 回答时间:2017-8-23 15:42:47
安 发表于 2017-8-23 14:01
每次发送的时候直接选择传输2个字节,然后测试一下效果。如果还不行,借助示波器看一下波形,是哪儿出的问 ...

这具体代码要怎么写?能不能给来个示例的?
回答时间:2017-8-23 16:31:55
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
        uint8_t cmd[]={0x09,0x00};
        HAL_SPI_Transmit(&hspi1,cmd,2,1000);
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
我没用过你这个外设,不确定是不是每次的操作,从51的代码来分析,大概写法如上。cmd可以作为入口参数。
select326 回答时间:2017-8-23 18:17:29
安 发表于 2017-8-23 16:31
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
        uint8_t cmd[]={0x09,0x00};
        HAL_S ...

大神,加个QQ吧:8800456
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版