【中科昊芯Start_DSC28027勇士开发板试用体验】SCI(UART)通讯

描述

本文来源电子发烧友社区,作者:xiaopeng, 帖子地址:https://bbs.elecfans.com/jishu_2287977_1_1.html

中科昊芯DSC2802x系列DSP拥有一个SCI(UART)模块,可以用来作为调试口或者与其它模块进行通讯。

开发板试用


其基本功能如下:
开发板试用


注意,这个sci模块数据位是可配置为1~8bit,并非我们常见的8~9bit数据位。
还具有增强功能:
开发板试用

也就是说硬件可以自动检测波特率,功能还是很强大的。

波特率计算公式:
开发板试用


代码实操:
新建两个文件,sci.c和sci.h
开发板试用


与sci相关的代码全部放在sci.c文件里面,sci.h用于sci相关的函数的声明。

1、sci模块硬件初始化:


  1. /******************************************************************
  2. *函数名:Scia_Config(uint32 baud)
  3. *参   数: baud,串口波特率
  4. *返回值:无
  5. *作   用: SCIA 初始化配置
  6. ******************************************************************/
  7. void Scia_Config(uint32 baud)
  8. {
  9.         uint32 div = 0;
  10.         uint32 divsel = 0;
  11.         uint32 lospcp = 0;
  12.         uint32 lspclk = 0;
  13.         uint16 brr = 0;
  14.  
  15.         //获取系统时钟的倍频、分频和低速外部时钟的值
  16.         div = SysCtrlRegs.PLLCR.bit.DIV;
  17.         divsel = SysCtrlRegs.PLLSTS.bit.DIVSEL;
  18.         lospcp = SysCtrlRegs.LOSPCP.bit.LSPCLK;
  19.  
  20.  
  21.         if (lospcp != 0)
  22.         {
  23.                 lospcp = lospcp * 2;
  24.         }
  25.         else
  26.         {
  27.                 lospcp = 1;
  28.         }
  29.  
  30.         /*分频值设置
  31.         divsel为 0时,系统时钟4分频
  32.         divsel为 1时,系统时钟4分频
  33.         divsel为 2时,系统时钟2分频
  34.         divsel为 3时,系统时钟1分频*/
  35.         switch (divsel)
  36.         {
  37.                 case 0:
  38.                 case 1:
  39.                 lspclk = 12000000 * div / 4 / lospcp;
  40.                 break;
  41.                 case 2:
  42.                 lspclk = 12000000 * div / 2 / lospcp;
  43.                 break;
  44.                 case 3:
  45.                 lspclk = 12000000 * div / 1 / lospcp;
  46.                 break;
  47.         }
  48.  
  49.         brr = lspclk / (baud * 8) - 1;
  50.  
  51.         /*SCI 停止位设置    0:一个停止位   1:两个停止位*/
  52.         SciaRegs.SCICCR.bit.STOPBITS = 0;
  53.  
  54.         /*SCI 奇偶校验位    0:奇偶校验   1:偶偶校验*/
  55.         SciaRegs.SCICCR.bit.PARITY = 0;
  56.  
  57.         /*SCI 奇偶校验使能   0:关闭   1:启用*/
  58.         SciaRegs.SCICCR.bit.PARITYENA = 0;
  59.  
  60.         /*SCI 字符长度   0:1个字长  1:2个字长 ... 7:8个字长*/
  61.         SciaRegs.SCICCR.bit.SCICHAR = 7;
  62.  
  63.         /*使能SCI的发送机和接收机*/
  64.         SciaRegs.SCICTL1.bit.TXENA = 1;
  65.         SciaRegs.SCICTL1.bit.RXENA = 1;
  66.  
  67.         /*SCI 16位波特率选择寄存器 高8位*/
  68.         SciaRegs.SCIHBAUD = (uint8) ((brr >> 8) & 0xff);
  69.         /*SCI 16位波特率选择寄存器 低8位*/
  70.         SciaRegs.SCILBAUD = (uint8) (brr & 0xff);
  71.  
  72.         /*SCI 发送中断使能*/
  73.         SciaRegs.SCICTL2.bit.TXINTENA = 1;
  74.         /*SCI 接收中断使能*/
  75.         SciaRegs.SCICTL2.bit.RXBKINTENA = 1;
  76.  
  77.         /*SCI 指定发送和接收中断处理函数,该寄存器受EALLOW保护*/
  78.         EALLOW;
  79.         PieVectTable.SCIRXINTA = &sciaRxIsr;
  80.         PieVectTable.SCITXINTA = &sciaTxIsr;
  81.         EDIS;
  82.  
  83.         /*PIE Group 9, SCIRXINTA*/
  84.         PieCtrlRegs.PIEIER9.bit.INTx1 = 1;
  85.         /*PIE Group 9, SCITXINTA*/
  86.         PieCtrlRegs.PIEIER9.bit.INTx2 = 1;
  87.         IER_ENABLE(M_INT9);
  88.  
  89.         /*SCI 软件复位,重新启动SCI*/
  90.         SciaRegs.SCICTL1.bit.SWRESET = 1;
  91.  
  92. }
复制代码


2、中断方式的数据发送


  1. /******************************************************************
  2. *函数名:Scia_Send(uint8 data)
  3. *参   数: data,准备发送的字节
  4. *返回值:无
  5. *作   用: SCIA 发送一个字节
  6. ******************************************************************/
  7. void Scia_Send(uint8 data)
  8. {
  9.         while (SciaRegs.SCICTL2.bit.TXRDY == 0)
  10.         {
  11.         }
  12.  
  13.         SciaRegs.SCITXBUF = data;
  14. }
复制代码


3、字符串的发送


  1. /******************************************************************
  2. *函数名:Scia_Print(char *str)
  3. *参   数: *str,要发送的字符串
  4. *返回值:无
  5. *作   用: SCIA 发送一个字符串
  6. ******************************************************************/
  7. void Scia_Print(char *str)
  8. {
  9.         while (*str != '')
  10.         {
  11.                 while (SciaRegs.SCICTL2.bit.TXRDY == 0)
  12.                 {
  13.                 }
  14.  
  15.                 SciaRegs.SCITXBUF = *str++;
  16.         }
  17. }
复制代码


4、发送与接收中断函数


  1. /******************************************************************
  2. *函数名:sciaTxIsr(void)
  3. *参   数: 无
  4. *返回值:无
  5. *作   用: SCIA中断发送处理
  6. ******************************************************************/
  7. INTERRUPT void sciaTxIsr(void)
  8. {
  9.         /*清除中断标志位*/
  10.         while (SciaRegs.SCICTL2.bit.TXRDY == 0)
  11.         {
  12.         }
  13.  
  14.         PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
  15. }
  16.  
  17. /******************************************************************
  18. *函数名:sciaRxIsr(void)
  19. *参   数: 无
  20. *返回值:无
  21. *作   用: SCIA中断接收处理
  22. ******************************************************************/
  23. INTERRUPT void sciaRxIsr(void)
  24. {
  25.         if (SciaRegs.SCICTL2.bit.TXRDY == 1)
  26.         {
  27.                 Scia_Send(SciaRegs.SCIRXBUF.bit.RXDT);
  28.                 PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
  29.         }
  30. }
复制代码


5、主函数
在上一篇GPIO发布的基础上增加sci功能,实现数据的收发,同时,led和按键功能也正常工作。


  1. int main(void)
  2. {
  3.         uint16_t cnt = 0;
  4.  
  5.         /*初始化系统控制:PLL,WatchDog,使能外设时钟*/
  6.         InitSysCtrl();
  7.         /*初始化内存控制寄存器,使能内存流水线模式*/
  8.         InitFlash();
  9.  
  10.         /*初始化串口通信的GPIO口*/
  11.         /*GPIO28: SCIRXDA*/
  12.         /*GPIO29: SCITXDA*/
  13.         InitSciGpio();
  14.  
  15.         /*关闭中断*/
  16.         DINT;
  17.  
  18.         /*将PIE控制寄存器初始化为默认状态,该状态禁止所有PIE中断并清除所有标志*/
  19.         InitPieCtrl();
  20.         /*禁止CPU中断并清除所有中断标志*/
  21.         IER = 0x0000;
  22.         IFR = 0x0000;
  23.         /*初始化PIE向量表,为PIE向量表中的所有中断向量配置对应向量的入口地址*/
  24.         InitPieVectTable();
  25.         /*SCI寄存器配置*/
  26.         Scia_Config(9600);
  27.  
  28.         /*使能外部中断和CPU中断*/
  29.         EINT;
  30.  
  31.         /*初始化KEY、LED*/
  32.         InitKEY();
  33.         InitLED();
  34.  
  35.         /*通过SCI发送字符串*/
  36.         Scia_Print("Hello haawking!rn");
  37.  
  38.         while(1)
  39.         {
  40.                 /*按键按下*/
  41.                 if(GpioDataRegs.GPADAT.bit.GPIO12 == 0)
  42.                 {
  43.                         /*D400亮*/
  44.                         GpioDataRegs.GPACLEAR.bit.GPIO7 = 1;
  45.                 }
  46.                 else
  47.                 {
  48.                         /*松开按键D400灭*/
  49.                         GpioDataRegs.GPASET.bit.GPIO7 = 1;
  50.                 }
  51.  
  52.                 if(cnt == 500)
  53.                 {
  54.                         cnt = 0;
  55.                         /*D401一直闪烁*/
  56.                         GpioDataRegs.GPATOGGLE.bit.GPIO6 = 1;
  57.                 }
  58.                 else
  59.                 {
  60.                         cnt++;
  61.                         DELAY_US(1000);
  62.                 }
  63.         }
  64.  
  65.         return 0;
  66. }
复制代码


测试

开发板试用


测试成功

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分