打印
[活动专区]

【赛元95F】+7.DIY拓展5:测试USCI0-UART

[复制链接]
1380|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
由于板子的面积不够大,暂时把之前的三个点位器给拆掉了,后面用到ADC的话会再次给焊接上去,暂时就这么愉快的决定了!
  每一次的离别都是为下一次的相遇做准备!

使用特权

评论回复
评论
21ic小喇叭 2020-4-3 16:22 回复TA
这个心 非常的标准 

相关帖子

沙发
一路向北lm|  楼主 | 2020-3-29 21:05 | 只看该作者
焊接了一大排的排针,虽然我不知道为什么要焊接这么多,但是目前这么做事对的!

使用特权

评论回复
板凳
一路向北lm|  楼主 | 2020-3-29 21:06 | 只看该作者
像测试串口一样,我们来测试一下集成IIC、SPI、UART为一体的USCI中的UART,用USCI0中的UART0的TX(P0.5)和RX(P0.6)来实现数据的收发,具体测试代码如下:
//USCI0.c 文件代码:
#include "bsp/usci0.h”

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

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

/*****************************************************
*函数名称:static void TWI0_Init(void)
*函数功能:TWI0初始化
*入口参数:void
*出口参数:void
*****************************************************/
static void TWI0_Init(void)
{
        OTCON |= 0x20;   //选择TWI0模式
        US0CON0 = 0x80;  //主模式, 使能应答标志位
        US0CON1 = 0x05;  //---- xxxx  x为时钟速率
        IE1 |= 0x01;
        EA = 1;
}

/*****************************************************
*函数名称:static void SPI0_Init(void)
*函数功能:SPI0初始化
*入口参数:void
*出口参数:void
*****************************************************/
static void SPI0_Init(void)
{
        OTCON |= 0X10;    //选择SPI0模式
        US0CON0 = 0x3F;   //设置SPI0为主设备,SCK空闲时间为高电平,SCK周期第二沿采集数据,时钟速率为Fsys/128
        US0CON1 = 0x01;   //MSB优先发送,8位传输,允许发送中断
        US0CON0 |= 0x80;  //开启SPI0
        IE1 |= 0x01;
        EA = 1;
}
/*****************************************************
*函数名称:void USCI0_Init(void)
*函数功能:USCI0初始化
*入口参数:void
*出口参数:void
*****************************************************/
void USCI0_Init(void)
{
        #if (SSI0_Mode == Uart0)
                        Uart0_Init(32,9600);       
        #endif
        #if (SSI0_Mode == TWI0)
                        TWI0_Init();
        #endif
        #if (SSI0_Mode == SPI0)
                        SPI0_Init();
        #endif       
}
/*****************************************************
*函数名称:void USCI0_Send_Byte(unsigned char c)
*函数功能:USCI0写一个字节数据
*入口参数:void
*出口参数:void
*****************************************************/
void USCI0_Send_Byte(unsigned char c)
{
  #if (SSI0_Mode == Uart0)
                US0CON3 = c;
                while(!Uart0SendFlag);
                Uart0SendFlag = 0;           
        #endif
        #if (SSI0_Mode == TWI0)
                US0CON1 |= 0x20;    //产生起始条件
                while(!TWI0Flag);
    TWI0Flag = 0;               
                US0CON3 = 0x10;            //发送地址及读命令
    while(!TWI0Flag);
    TWI0Flag = 0;
    US0CON3 = 0x55;            //发送地址及读命令
    while(!TWI0Flag);
    TWI0Flag = 0;
                USCI_Delay(100);
                US0CON1 |= 0x10;
                USCI_Delay(100);
        #endif
        #if (SSI0_Mode == SPI0)
                US0CON2 = c;
                while(!SPI0Flag);
                SPI0Flag = 0;
    USCI_Delay(1000);       
        #endif       
}

/*****************************************************
*函数名称:void USCI0_Send_String(unsigned char *str)
*函数功能:USCI0发送一个字符串
*入口参数:void
*出口参数:void
*****************************************************/
void USCI0_Send_String(unsigned char *str)
{
   while(*str)
                {
                  USCI0_Send_Byte(*str);
                        str++;
                }
}

/*****************************************************
*函数名称:void TWI0/SPI0/UART0_Int() interrupt 7
*函数功能:SSI0中断函数
*入口参数:void
*出口参数:void
*****************************************************/
#if (SSI0_Mode == Uart0)
void Uart0_Int() interrupt 7   //Uart0中断函数
{
        if(US0CON0&0x02)    //发送标志位判断
        {
                US0CON0 &= 0xFD;
                Uart0SendFlag = 1;
        }
        if((US0CON0&0x01))  //接收标志位判断
        {
                US0CON0 &= 0xFE;
                Uart0ReceiveFlag = 1;
        }       
}
#endif

#if (SSI0_Mode == TWI0)
void TWI0_Int() interrupt 7     //TWI0中断函数
{
        if(US0CON0&0x40)
        {
                US0CON0 &= 0xbf;  //中断清零
                TWI0Flag = 1;
        }       
}
#endif

#if (SSI0_Mode == SPI0)
void SpiInt(void) interrupt 7    //SPI0中断函数
{          
        if(US0CON1&0X08)    //发送缓存器空标志判断
        {
                US0CON1 &= ~0X08;
        }
        if(US0CON1&0X80)    //数据传输标志位判断
        {
                US0CON1 &= ~0X80;
                SPI0Flag = 1;
        }
}
#endif


使用特权

评论回复
地板
一路向北lm|  楼主 | 2020-3-29 21:06 | 只看该作者
/****************************************************************************/
//USCI0.h 文件代码:
#ifndef _USCI0_H
#define _USCI0_H
#include "H/SC95F861x_C.H"
#include "bsp/timer.h"

//USCI0 三合一模式:
#define  Uart0   0
#define  TWI0    1
#define  SPI0    2

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

static void Uart0_Init(unsigned int Freq,unsigned long int baud);
static void TWI0_Init(void);
static void SPI0_Init(void);
void USCI0_Init(void);
void USCI0_Send_Byte(unsigned char c);
void USCI0_Send_String(unsigned char *str);
#endif


使用特权

评论回复
5
一路向北lm|  楼主 | 2020-3-29 21:07 | 只看该作者
哈哈,今天的很简单,跟串口的类似,能收能发就行啦,主要是得收的准确!简单的效果如下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

274

主题

3760

帖子

75

粉丝