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

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

[复制链接]
  • TA的每日心情
    开心
    2024-3-1 08:56
  • 签到天数: 1 天

    [LV.1]初来乍到

    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


    回复 送花

    使用道具 举报

    该用户从未签到

    66

    主题

    714

    回帖

    1万

    积分

    荣誉版主

    积分
    10975
    发表于 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)如果问题还存在,那就要试试使用临界区保护了




    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 12:37
  • 签到天数: 58 天

    [LV.5]常住居民I

    12

    主题

    130

    回帖

    419

    积分

    中级会员

    积分
    419
    发表于 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, 2024-6-1 20:27 , Processed in 0.075445 second(s), 40 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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