[活动专区] 【赛元95F】+7.DIY拓展5:测试USCI0-UART

[复制链接]
1588|5
 楼主| 一路向北lm 发表于 2020-3-29 21:04 | 显示全部楼层 |阅读模式
由于板子的面积不够大,暂时把之前的三个点位器给拆掉了,后面用到ADC的话会再次给焊接上去,暂时就这么愉快的决定了!
90235e809cdd9988c.png
  每一次的离别都是为下一次的相遇做准备!

评论

这个心 非常的标准  发表于 2020-4-3 16:22
 楼主| 一路向北lm 发表于 2020-3-29 21:05 | 显示全部楼层
焊接了一大排的排针,虽然我不知道为什么要焊接这么多,但是目前这么做事对的!
546915e809d0a633e4.png
 楼主| 一路向北lm 发表于 2020-3-29 21:06 | 显示全部楼层
像测试串口一样,我们来测试一下集成IIC、SPI、UART为一体的USCI中的UART,用USCI0中的UART0的TX(P0.5)和RX(P0.6)来实现数据的收发,具体测试代码如下:
  1. //USCI0.c 文件代码:
  2. #include "bsp/usci0.h”

  3. bit Uart0SendFlag = 0;    //Uart0发送中断标志位
  4. bit Uart0ReceiveFlag = 0; //Uart0接收中断标志位
  5. bit SPI0Flag = 0;         //SPI0数据传输完成标志位
  6. bit TWI0Flag = 0;         //TWI0中断标志位

  7. /*****************************************************
  8. *函数名称:static void Uart0_Init(uint Freq,unsigned long int baud)
  9. *函数功能:Uart0中断初始化
  10. *入口参数:Freq-主频,baud-波特率
  11. *出口参数:void
  12. *****************************************************/  
  13. static void Uart0_Init(unsigned int Freq,unsigned long int baud)
  14. {
  15.         P0CON &= 0xCF;    //TX/RX设置为输入带上拉
  16.         P0PH  |= 0x30;
  17.         OTCON |= 0x30;    //串行接口SSI0选择Uart0通信
  18.         US0CON0 = 0x50;   //设置通信方式为模式一,允许接收
  19.         US0CON1 = Freq*1000000/baud;   //波特率低位控制
  20.         US0CON2 = (Freq*1000000/baud)>>8;   //波特率高位控制
  21.         IE1 |= 0x01;      //开启SSI0中断
  22.   EA = 1;       
  23. }

  24. /*****************************************************
  25. *函数名称:static void TWI0_Init(void)
  26. *函数功能:TWI0初始化
  27. *入口参数:void
  28. *出口参数:void
  29. *****************************************************/
  30. static void TWI0_Init(void)
  31. {
  32.         OTCON |= 0x20;   //选择TWI0模式
  33.         US0CON0 = 0x80;  //主模式, 使能应答标志位
  34.         US0CON1 = 0x05;  //---- xxxx  x为时钟速率
  35.         IE1 |= 0x01;
  36.         EA = 1;
  37. }

  38. /*****************************************************
  39. *函数名称:static void SPI0_Init(void)
  40. *函数功能:SPI0初始化
  41. *入口参数:void
  42. *出口参数:void
  43. *****************************************************/
  44. static void SPI0_Init(void)
  45. {
  46.         OTCON |= 0X10;    //选择SPI0模式
  47.         US0CON0 = 0x3F;   //设置SPI0为主设备,SCK空闲时间为高电平,SCK周期第二沿采集数据,时钟速率为Fsys/128
  48.         US0CON1 = 0x01;   //MSB优先发送,8位传输,允许发送中断
  49.         US0CON0 |= 0x80;  //开启SPI0
  50.         IE1 |= 0x01;
  51.         EA = 1;
  52. }
  53. /*****************************************************
  54. *函数名称:void USCI0_Init(void)
  55. *函数功能:USCI0初始化
  56. *入口参数:void
  57. *出口参数:void
  58. *****************************************************/
  59. void USCI0_Init(void)
  60. {
  61.         #if (SSI0_Mode == Uart0)
  62.                         Uart0_Init(32,9600);       
  63.         #endif
  64.         #if (SSI0_Mode == TWI0)
  65.                         TWI0_Init();
  66.         #endif
  67.         #if (SSI0_Mode == SPI0)
  68.                         SPI0_Init();
  69.         #endif       
  70. }
  71. /*****************************************************
  72. *函数名称:void USCI0_Send_Byte(unsigned char c)
  73. *函数功能:USCI0写一个字节数据
  74. *入口参数:void
  75. *出口参数:void
  76. *****************************************************/
  77. void USCI0_Send_Byte(unsigned char c)
  78. {
  79.   #if (SSI0_Mode == Uart0)
  80.                 US0CON3 = c;
  81.                 while(!Uart0SendFlag);
  82.                 Uart0SendFlag = 0;           
  83.         #endif
  84.         #if (SSI0_Mode == TWI0)
  85.                 US0CON1 |= 0x20;    //产生起始条件
  86.                 while(!TWI0Flag);
  87.     TWI0Flag = 0;               
  88.                 US0CON3 = 0x10;            //发送地址及读命令
  89.     while(!TWI0Flag);
  90.     TWI0Flag = 0;
  91.     US0CON3 = 0x55;            //发送地址及读命令
  92.     while(!TWI0Flag);
  93.     TWI0Flag = 0;
  94.                 USCI_Delay(100);
  95.                 US0CON1 |= 0x10;
  96.                 USCI_Delay(100);
  97.         #endif
  98.         #if (SSI0_Mode == SPI0)
  99.                 US0CON2 = c;
  100.                 while(!SPI0Flag);
  101.                 SPI0Flag = 0;
  102.     USCI_Delay(1000);       
  103.         #endif       
  104. }

  105. /*****************************************************
  106. *函数名称:void USCI0_Send_String(unsigned char *str)
  107. *函数功能:USCI0发送一个字符串
  108. *入口参数:void
  109. *出口参数:void
  110. *****************************************************/
  111. void USCI0_Send_String(unsigned char *str)
  112. {
  113.    while(*str)
  114.                 {
  115.                   USCI0_Send_Byte(*str);
  116.                         str++;
  117.                 }
  118. }

  119. /*****************************************************
  120. *函数名称:void TWI0/SPI0/UART0_Int() interrupt 7
  121. *函数功能:SSI0中断函数
  122. *入口参数:void
  123. *出口参数:void
  124. *****************************************************/
  125. #if (SSI0_Mode == Uart0)
  126. void Uart0_Int() interrupt 7   //Uart0中断函数
  127. {
  128.         if(US0CON0&0x02)    //发送标志位判断
  129.         {
  130.                 US0CON0 &= 0xFD;
  131.                 Uart0SendFlag = 1;
  132.         }
  133.         if((US0CON0&0x01))  //接收标志位判断
  134.         {
  135.                 US0CON0 &= 0xFE;
  136.                 Uart0ReceiveFlag = 1;
  137.         }       
  138. }
  139. #endif

  140. #if (SSI0_Mode == TWI0)
  141. void TWI0_Int() interrupt 7     //TWI0中断函数
  142. {
  143.         if(US0CON0&0x40)
  144.         {
  145.                 US0CON0 &= 0xbf;  //中断清零
  146.                 TWI0Flag = 1;
  147.         }       
  148. }
  149. #endif

  150. #if (SSI0_Mode == SPI0)
  151. void SpiInt(void) interrupt 7    //SPI0中断函数
  152. {          
  153.         if(US0CON1&0X08)    //发送缓存器空标志判断
  154.         {
  155.                 US0CON1 &= ~0X08;
  156.         }
  157.         if(US0CON1&0X80)    //数据传输标志位判断
  158.         {
  159.                 US0CON1 &= ~0X80;
  160.                 SPI0Flag = 1;
  161.         }
  162. }
  163. #endif


 楼主| 一路向北lm 发表于 2020-3-29 21:06 | 显示全部楼层
  1. /****************************************************************************/
  2. //USCI0.h 文件代码:
  3. #ifndef _USCI0_H
  4. #define _USCI0_H
  5. #include "H/SC95F861x_C.H"
  6. #include "bsp/timer.h"

  7. //USCI0 三合一模式:
  8. #define  Uart0   0
  9. #define  TWI0    1
  10. #define  SPI0    2

  11. //选择当前使用的模式
  12. #define  USCI0_Mode  Uart0

  13. static void Uart0_Init(unsigned int Freq,unsigned long int baud);
  14. static void TWI0_Init(void);
  15. static void SPI0_Init(void);
  16. void USCI0_Init(void);
  17. void USCI0_Send_Byte(unsigned char c);
  18. void USCI0_Send_String(unsigned char *str);
  19. #endif


 楼主| 一路向北lm 发表于 2020-3-29 21:07 | 显示全部楼层
哈哈,今天的很简单,跟串口的类似,能收能发就行啦,主要是得收的准确!简单的效果如下
89005e809d78b0c31.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

3837

帖子

81

粉丝
快速回复 在线客服 返回列表 返回顶部