找回密码
 立即注册
查看: 889|回复: 2

STC32G 的IIC控制器驱动TM1640B不成功

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-03-01 08:56:48

3

主题

2

回帖

49

积分

新手上路

积分
49
发表于 2023-8-8 16:50:53 | 显示全部楼层 |阅读模式
IIC 输出波形上升沿较缓,不知道什么问题,请教大神

STC32G 的IIC控制器驱动TM1640B不成功-1.png


程序如下:

void I2C_config(void)
{
        I2C_InitTypeDef                I2C_InitStructure;

        I2C_InitStructure.I2C_Mode      = I2C_Mode_Master;            //主机模式    Ö÷´ÓÑ¡Ôñ   I2C_Mode_Master, I2C_Mode_Slave
        I2C_InitStructure.I2C_Enable    = ENABLE;                                //使能IIC      I2C¹¦ÄÜʹÄÜ,   ENABLE, DISABLE
        I2C_InitStructure.I2C_MS_WDTA   = DISABLE;                                //禁止主机自动发送    Ö÷»úʹÄÜ×Ô¶¯·¢ËÍ,  ENABLE, DISABLE
        I2C_InitStructure.I2C_Speed     = 16;                                        // 速度     ÜÏßËÙ¶È=Fosc/2/(Speed*2+4),      0~63
        I2C_Init(&I2C_InitStructure);
        NVIC_I2C_Init(I2C_Mode_Master,DISABLE,Priority_0);                //Ö÷´Óģʽ, I2C_Mode_Master, I2C_Mode_Slave; ÖжÏʹÄÜ, ENABLE/DISABLE; ÓÅÏȼ¶(µÍµ½¸ß) Priority_0,Priority_1,Priority_2,Priority_3

}



//IIC连接P14 P15

void Switch_config(void)
{       
        I2C_SW(I2C_P14_P15);                  //I2C_P14_P15,I2C_P24_P25,I2C_P76_P77,I2C_P33_P32
        SPI_SW(SPI_P22_P23_P24_P25);        //SPI_P54_P13_P14_P15,SPI_P22_P23_P24_P25,SPI_P54_P40_P41_P43,SPI_P35_P34_P33_P32
               
}


   //系统始化时测试显示

void vSystemInit(void)
{
  
    WTST = 0;     
    EAXFR = 1;   
    CKCON = 0;   
       
       
        GPIO_config();
        Timer_config();
        ADC_config();
        UART_config();
        Exti_config();
       
        Switch_config();
        SPI_config();
        CMP_config();

        //IIC初始化及显示
       
        I2C_config();       
        TM1640B_set_model(1);   //地址自增
       
        TM1640B_display(0x89);  //亮度设置
        TM1640B_write_data();   //写入测试数据并显示
       
}



//****************************模式 1/0
void        TM1640B_set_model(uint8_t m)
{
       
        if(m)
        {
                        TM1640B_start();
                        TM1640B_send_byte(0x40); //地址自增
                        TM1640B_stop();
        }
        else
                        {
                        TM1640B_start();
                        TM1640B_send_byte(0x44);//固定地址
                        TM1640B_stop();
                }
               
                       
       
}

//********************************************************


//********************************************************

//

void        TM1640B_display(char k)
{
       
        TM1640B_start();
        TM1640B_send_byte(k);
        TM1640B_stop();
       
       
}

//********************************************************


//********************************************************


//写入显存数据
void        TM1640B_write_data()
{
       
        TM1640B_start();
        TM1640B_send_byte(0xc0);                      //发送显存地址
        TM1640B_send_byte(num_display[0]);                //1
        TM1640B_send_byte(num_display[1]);
        TM1640B_send_byte(num_display[2]);
        TM1640B_send_byte(num_display[3]);
        TM1640B_send_byte(num_display[4]);
        TM1640B_send_byte(num_display[5]);
        TM1640B_send_byte(num_display[6]);
        TM1640B_send_byte(num_display[7]);              //8
        TM1640B_send_byte(num_display[8]);
        TM1640B_send_byte(num_display[9]);
        TM1640B_send_byte(num_display[10]);
        TM1640B_send_byte(num_display[11]);
        TM1640B_send_byte(num_display[12]);
        TM1640B_send_byte(num_display[13]);
        TM1640B_send_byte(num_display[14]);
        TM1640B_send_byte(num_display[15]);                //16
        TM1640B_stop();

        TM1640B_display(0x88);                            //显示开

       
}

//********************************************************


//********************************************************


void        TM1640B_send_byte(char num)
{
        // taskENTER_CRITICAL();
        SendData(num);                                //IICÇý¶¯
        //taskEXIT_CRITICAL();
}

//********************************************************






//********************************************************


void Start()
{
        I2CMSCR = 0x01;                         //·¢ËÍSTARTÃüÁî
        Wait();
}


//********************************************************

void SendData(char dat)
{
        I2CTXD = dat;                           //дÊý¾Ýµ½Êý¾Ý»º³åÇø
        I2CMSCR = 0x02;                         //·¢ËÍSENDÃüÁî
        Wait();
}


//********************************************************


//********************************************************


void Stop()
{
        I2CMSCR = 0x06;                         //·¢ËÍSTOPÃüÁî
        Wait();
}

//********************************************************




TM1640B驱动时序:
STC32G 的IIC控制器驱动TM1640B不成功-2.png


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2023-8-8 17:46:12 | 显示全部楼层
本帖最后由 杨为民 于 2023-8-8 17:49 编辑

你的问题发到这个版块,想来是想在FreeRTOS中使用碰到问题了。对于想在RTOS中进行这类(IIC、SPI、惨、UART)串行通讯编程的朋友,有如下建议:
(1)先在没有RTOS的环境下进行实验,验证你的程序。比如你上面的程序看不出有什么问题,我相信你单独写个“main()”函数,一试就成功了。STC单片机手册和范例中的程序在裸机编程的方式下的正确性不需怀疑。

(2)如果上面一步成功,然后同样的程序一嵌入到RTOS系统中就出问题,那么可以试试我建议的“孤立疗法”去查找问题所在的地方。通常在RTOS串行通讯的问题出在受多任务调度的影响。
(3)编写RTOS的串行通讯程序,临界区保护是十分必要和关键的。论坛中给出的“uCOS-II for STC8H8K64U, STC8A8K64D4系列 ”中的RTOS串口通讯程序写得十分专业,值得去认真仔细学习。只是那个例子有些复杂,所以我在移植过程中就没有采用。
(4)你的问题我猜测还是出在“Wait();”函数上。与STC8系列单片机不同,在STC32G/F系统单片机的RTOS程序中,手册中的这句话很重要:“系统上电后设置EAXSFR=1,然后就不要再任何地方在改变”
XSFR.jpg
(5)如果问题还存在,那就要试试使用临界区保护了




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:379
  • 最近打卡:2025-05-02 11:40:42

43

主题

336

回帖

595

积分

高级会员

积分
595
发表于 2024-3-22 19:51:02 | 显示全部楼层
本帖最后由 qepuemc 于 2024-3-22 22:56 编辑

我用的TM1640也是显示不出LED。看来也要给 孤立疗法 了。谢谢
我的给搞好了。如果还有用的话或以后不会的可以看看的我
https://www.stcaimcu.com/forum.p ... amp;extra=#pid66868

我没做好是因为卖家发错数码管了!
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 01:04 , Processed in 0.122939 second(s), 66 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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