杰理AC692X---串口发送奇偶校验位驱动TM1652

Author : Jim

微信:life5270

前段时间调试TM1652驱动LED数码管显示,我和朋友研究了一个下午,愣是没驱动起来。

最后寻找原厂技术支持发现是TM1652数据接收时,要接收多一个奇偶校验位。

这就很尴尬了,TM1652规格书上面确实有写到这一点,但是它愣是被我们忽略了。

所以说,在研究规格书的时候,还是要细致一点。

TM1652使用的通讯方式可以和串口通讯兼容,所以我们是直接用串口来驱动的。

那么问题来了,JL692X系列的芯片,怎么添加串口奇偶校验位?

查找JL692X的规格书,发现有一个寄存器是设置9BIT发送模式的,还有另一个寄存器就是设置第九位数据了。

杰理AC692X---串口发送奇偶校验位驱动TM1652_第1张图片

根据这两个寄存器,就可以完成我们需要的奇偶校验了。

下面是相关代码:

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),最后再写一个控制指令就可以了。

杰理AC692X---串口发送奇偶校验位驱动TM1652_第2张图片

 

 

你可能感兴趣的:(杰理AC692X学习记录)