C2000 F280049 SCI模块开发串口通讯(源码讲解)

适用于280x、281x、2801x、2804x、2807x、28002x、28003x、28004x、280013x、280015x、2823x、2833x、2834x、2837xD、2837xS、2838x、M35x、M36x的机型

  • 具体情况请参考F280049的用户指南。
  • 此项目实现了16 级 FIFO串口通讯,发送、接收功能以及接收中断。

具体配置如下:

/*
 * ds_usart.c
 *
 *  Created on: 2023年9月19日
 *      Author: chends
 */

#include "ds_usart.h"//此头文件自己定义一个,用来声明下面的函数即可
#include "F28x_Project.h"

//GPIO口配置
void InitSciaGpio(void)
{
   EALLOW;
    GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;    // Enable pull-up for GPIO28 (SCIRXDA)

    GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;    // Enable pull-up for GPIO29 (SCITXDA)

    GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;  // Asynch input GPIO28 (SCIRXDA)

    GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;   // Configure GPIO28 for SCIRXDA operation

    GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;   // Configure GPIO29 for SCITXDA operation

    EDIS;
}

/*
 * 内部生成的串行时钟由低速外设时钟(LSPCLK)信号和两个波特选择寄存器决定。
 * SCI 使用这些寄存器的 16 位值为通信模式选择 64K 串行时钟速率之一。
 * BRR = (SCIHBAUD << 8) + (SCILBAUD)
 * SCI 波特率的计算公式如下: SCI 异步波特率 = LSPCLK / ((BRR + 1) *8)
 * 或者,
 * BRR = LSPCLK / (SCI 异步波特率 * 8) - 1
 * 注意,上述公式仅适用于 0 < BRR < 65536 的情况。
 * 如果 BRR = 0,则 SCI 异步波特 = LSPCLK / 16
 * 其中BRR = 波特选择寄存器中的 16 位值(十进制)
 */
void sciA_init(Uint32 baud,Uint16 RxFrameLength)
{
    Uint16 _BRR;

    RxFrameLength=RxFrameLength > 16 ? 16 : RxFrameLength;

    InitSciaGpio();
    EALLOW;
    PieVectTable.SCIA_RX_INT= &dasen_SciARxIRQn;
    CpuSysRegs.PCLKCR7.bit.SCI_A=1;//使能SCI_A时钟
    EDIS;

    SciaRegs.SCICCR.bit.STOPBITS=0;//0-停止位:1位;1-停止位:2位
    SciaRegs.SCICCR.bit.PARITYENA=0;//0-不使能校验;1-使能校验
    SciaRegs.SCICCR.bit.LOOPBKENA=0;//回环测试模式:0-disable;1-enable。
    SciaRegs.SCICCR.bit.SCICHAR=7;//字符长度控制位:7h (R/W) = SCICHAR_LENGTH_8

    SciaRegs.SCICTL1.bit.RXERRINTENA=0;//SCI接收错误中断:0-disable;1-enable。

    SciaRegs.SCICTL1.bit.SWRESET=1;//SCI软件复位(低电平有效)。不影响配置位,会影响SCI的工作标志。
                                   //0h (R/W) = 将 0 写入该位可将 SCI 状态机和操作标志(寄存器 SCICTL2 和 SCIRXST)初始化为复位状态。
                                   //1h (R/W) = 系统复位后,向该位写入 1,重新启用 SCI。

    SciaRegs.SCICTL1.bit.TXENA=1;//SCI发送器使能位:0-disable;1-enable。
    SciaRegs.SCICTL1.bit.RXENA=1;//SCI接收机使能位:0-disable;1-enable。

    _BRR =(Uint16)((SCI_LSPCLK/(baud * 8))-1);
    SciaRegs.SCIHBAUD.bit.BAUD=_BRR>>8;
    SciaRegs.SCILBAUD.bit.BAUD=(_BRR&0XFF);

    SciaRegs.SCICTL2.bit.RXBKINTENA=1;//使能RXRDY或BRKDT中断。SCIFFENA=1时,无效。
    SciaRegs.SCICTL2.bit.TXINTENA=0;//禁用TXRDY中断

    SciaRegs.SCIFFTX.bit.SCIRST=1;//写入 0 重置 SCI 发送和接收通道。SCI FIFO 寄存器配置位将保持不变。1-SCI FIFO 可以恢复发送或接收。
    SciaRegs.SCIFFTX.bit.SCIFFENA=1;//SCI FIFO enable: 0-禁用SCI FIFO增强功能;1-启用SCI FIFO增强功能
    SciaRegs.SCIFFTX.bit.TXFIFORESET=1;//发送 FIFO 复位 0h (R/W) = 将 FIFO 指针复位为零并保持复位状态 1h (R/W) = 重新启用传输 FIFO 操作
    SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;//写1清除TXFFINT位(发送FIFO中断标志位)
    SciaRegs.SCIFFTX.bit.TXFFIENA=0;//0-禁用TX FIFO中断;1-使能TX FIFO中断
    SciaRegs.SCIFFTX.bit.TXFFIL=5;//当TXFFST小于等于TXFFIL时,会产生中断信号。TXFFIL不能超过FIFO深度16.

    SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;//写1清除RXFFOVF位(接收FIFO溢出标志位)
    SciaRegs.SCIFFRX.bit.RXFIFORESET=1;//接收FIFO复位 0h (R/W) = 写 0 将 FIFO 指针复位为零,并保持复位状态。1h (R/W) = 重新启用接收 FIFO 操作
    SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//写1清除RXFFINT位(接收FIFO中断标志位)
    SciaRegs.SCIFFRX.bit.RXFFIENA=1;//使能RX FIFO 中断,只要接收 FIFO 状态 (RXFFST) 位匹配(等于或大于)中断触发电平位 RXFFIL(4-0 位),就会触发该中断。
    SciaRegs.SCIFFRX.bit.RXFFIL=RxFrameLength;//当RXFFST大于等于RXFFIL时,会产生中断信号。RXFFIL不能超过FIFO深度16.

    SciaRegs.SCIFFCT.bit.FFTXDLY=0;//FIFO传输延时
    SciaRegs.SCIPRI.bit.FREESOFT=2;//0h (R/W) = 挂起时立即停止 1h (R/W) = 停止前完成当前接收/发送序列 2h (R/W) = 自由运行 3h (R/W) = 自由运行


    IER |= M_INT9;
    PieCtrlRegs.PIEIER9.bit.INTx1=1;
    PieCtrlRegs.PIEACK.bit.ACK9=1;
    //使能总中断
    EINT;
    ERTM;
}

//FIFO有空位时,写1个字节数据到发送缓存寄存器中
void UARTa_SendByte(Uint16 a)
{
    while (SciaRegs.SCIFFTX.bit.TXFFST > 15);
    SciaRegs.SCITXBUF.all=a;
}

//发送字符串
void UARTa_SendString(char * msg)
{
    int i=0;

    while(msg[i] != '\0')
    {
        UARTa_SendByte(msg[i]);
        i++;
    }
}

char* msg;
Uint16 recvdata;
Uint16 len=0,n;
Uint16 RecvData[100];

//自定义的接收中断函数,当RXFFST大于等于RXFFIL时进入此中断。
interrupt void dasen_SciARxIRQn(void)
{	
	//把FIFO中接收到的数据全部读出
    while(SciaRegs.SCIFFRX.bit.RXFFST > 0)
    {
        recvdata = SciaRegs.SCIRXBUF.all;
        RecvData[len]=recvdata;
        len++;
    }

	//把接收到的数据发送回去
    msg = "  You sent: \0";
    UARTa_SendString(msg);
    for(n=0;n<len;n++)
    {
        UARTa_SendByte(RecvData[n]);
     }

     UARTa_SendString("\r\n\0");

     len=0;

	//清除相关中断标志位
    SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;
    SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;
    PieCtrlRegs.PIEACK.bit.ACK9=1;
}

SCI_LSPCLK是LSPCLK的频率,默认是CPU频率的四分之一。我这里CPUCLK是100MHZ,所以SCI_LSPCLK=25000000。

使用如下

	   sciA_init(115200,8);//baudrate-115200,接收一帧长度为8,接收到8个数据后会进入到中断处理
       UARTa_SendString("SCIA test!\r\n");
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木龠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值