wodaniii 发表于 2023-8-8 16:50:53

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

IIC 输出波形上升沿较缓,不知道什么问题,请教大神




程序如下:

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);                //1
        TM1640B_send_byte(num_display);
        TM1640B_send_byte(num_display);
        TM1640B_send_byte(num_display);
        TM1640B_send_byte(num_display);
        TM1640B_send_byte(num_display);
        TM1640B_send_byte(num_display);
        TM1640B_send_byte(num_display);              //8
        TM1640B_send_byte(num_display);
        TM1640B_send_byte(num_display);
        TM1640B_send_byte(num_display);
        TM1640B_send_byte(num_display);
        TM1640B_send_byte(num_display);
        TM1640B_send_byte(num_display);
        TM1640B_send_byte(num_display);
        TM1640B_send_byte(num_display);                //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驱动时序:



杨为民 发表于 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,然后就不要再任何地方在改变”

(5)如果问题还存在,那就要试试使用临界区保护了




qepuemc 发表于 2024-3-22 19:51:02

本帖最后由 qepuemc 于 2024-3-22 22:56 编辑

我用的TM1640也是显示不出LED。看来也要给 孤立疗法 了。谢谢
我的给搞好了。如果还有用的话或以后不会的可以看看的我
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7396&highlight=tm1640%20%E6%95%B0%E7%A0%81%E7%AE%A1&page=0&extra=#pid66868

我没做好是因为卖家发错数码管了!
页: [1]
查看完整版本: STC32G 的IIC控制器驱动TM1640B不成功