Author : Jim
微信:life5270
前段时间调试TM1652驱动LED数码管显示,我和朋友研究了一个下午,愣是没驱动起来。
最后寻找原厂技术支持发现是TM1652数据接收时,要接收多一个奇偶校验位。
这就很尴尬了,TM1652规格书上面确实有写到这一点,但是它愣是被我们忽略了。
所以说,在研究规格书的时候,还是要细致一点。
TM1652使用的通讯方式可以和串口通讯兼容,所以我们是直接用串口来驱动的。
那么问题来了,JL692X系列的芯片,怎么添加串口奇偶校验位?
查找JL692X的规格书,发现有一个寄存器是设置9BIT发送模式的,还有另一个寄存器就是设置第九位数据了。
根据这两个寄存器,就可以完成我们需要的奇偶校验了。
下面是相关代码:
void Tm1652_uart_init(u32 bund)
{
printf("----------------user_uart_init---------------------");
JL_IOMAP->CON1 |= BIT(15) | BIT(14);
// JL_PORTC->PU |= BIT(4);
JL_PORTC->OUT |= BIT(4);
// JL_PORTC->DIR |= BIT(5) ;
JL_PORTC->DIR &= ~BIT(4) ;
JL_UART2->BAUD = (UART_CLK / bund) / 4 - 1;
JL_UART2->CON = BIT(13) | BIT(12) | BIT(10) | BIT(1) | BIT(0);
}
void uart2_putchar(s8 ch)
{
JL_UART2->BUF = ch;
__asm__ volatile("csync");
while((JL_UART2->CON & BIT(15)) == 0);//TX IDLE
}
void Tm1652_send_byte(u8 byte)//向TM1652发送一个Byte
{
u8 ptr = byte;
static u8 cnt = 0;
for(u8 i=0;i<8;i++){ /*计算当前发送的Byte中二进制1的个数*/
if(ptr & BIT(7)){
cnt++;
}
ptr = ptr << 1;
}
if(cnt % 2){ /*二进制1个数为偶数,CON-9置0*/
JL_UART2->CON &=~ BIT(9);
}else{ /*二进制1个数为奇数,CON-9置1*/
JL_UART2->CON |= BIT(9);
}
cnt = 0;
uart2_putchar(byte);//发送一个Byte
}
只用到了串口发送,所以只初始化了PC4引脚作为TX,RX引脚不初始化。
到这一步通讯方面基本上就没什么问题了。剩下的就是驱动TM1652了。
TM1652的使用也非常简单,先写一个地址(0x08),再跟5-6Byte数据(根据硬件选择5*8还是6*7),最后再写一个控制指令就可以了。