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: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 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]