SCI串口简单介绍
SCI(Serial Communication Interface)串口是一种用于串行通信的接口,主要用于与其他设备进行数据交换。主要有以下特点
-
全双工通信:SCI支持全双工模式,即可以同时进行数据的发送和接收,适合实时数据传输。
-
可配置的波特率:SCI接口的波特率可通过配置寄存器进行调整,支持多种波特率,以满足不同通信需求。
-
数据帧格式:支持可配置的数据位(通常为8位或9位)、停止位(1位或2位)和奇偶校验,使得通信更加灵活和可靠。
-
中断功能:SCI可以通过中断方式处理接收和发送数据,支持高效的数据传输和处理。
-
FIFO缓冲:一些通道支持FIFO(先进先出)缓冲区,可以有效地管理数据流,减轻CPU负担,提高数据处理效率。
博主之前学习串口时还是用的STM32,需要依次配置各个寄存器,计算Baud Rate,配置FIFO等等,目前学习DSP用的F28379D,TI提供了syscfg工具,大大减少了配置的时间。
SCI串口配置
在本篇文章中,先简单介绍如何配置SCI串口。
首先,LAUNCHXL-F28379D的SCIA是被占用的,和XDS100V2调试接口一起,所以本例使用SCIB,在Use Hardware中只有SCIB和SCIC,因为Launchpad只有SCIB和SCIC留出了接口。
上面的配置为:
Baud Rate为115200,同时还分析了实际的Baud Rate为114679 误差为-0.452。长度为8位,Stop Mode为1 表示有1位停止位, Parity Mode为1表示没有奇偶校验位。勾选Use FIFO表示,使用FIFO功能。FIFO指的是First input first output,即先进先出,可以起到缓冲数据的作用,保证数据的顺序性,降低处理延迟等。以上便完成了SCI的配置。
理解生成的SCI代码
PinMux_init() in board.c
配置相应的引脚为SCI功能
void PinMux_init()
{// 省略了不相关的代码//// SCIB -> mySCIB Pinmux//GPIO_setPinConfig(mySCIB_SCIRX_PIN_CONFIG);GPIO_setPadConfig(mySCIB_SCIRX_GPIO, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);GPIO_setQualificationMode(mySCIB_SCIRX_GPIO, GPIO_QUAL_ASYNC);GPIO_setPinConfig(mySCIB_SCITX_PIN_CONFIG);GPIO_setPadConfig(mySCIB_SCITX_GPIO, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);GPIO_setQualificationMode(mySCIB_SCITX_GPIO, GPIO_QUAL_ASYNC);}
mySCIB_init() in board.c
按照SCI串口配置部分的内容,操作相应的寄存器。这里直接调用的是driverlib中的函数。
void mySCIB_init(){SCI_clearInterruptStatus(mySCIB_BASE, SCI_INT_RXFF | SCI_INT_TXFF | SCI_INT_FE | SCI_INT_OE | SCI_INT_PE | SCI_INT_RXERR | SCI_INT_RXRDY_BRKDT | SCI_INT_TXRDY);SCI_clearOverflowStatus(mySCIB_BASE);SCI_resetTxFIFO(mySCIB_BASE);SCI_resetRxFIFO(mySCIB_BASE);SCI_resetChannels(mySCIB_BASE);SCI_setConfig(mySCIB_BASE, DEVICE_LSPCLK_FREQ, mySCIB_BAUDRATE, (SCI_CONFIG_WLEN_8|SCI_CONFIG_STOP_ONE|SCI_CONFIG_PAR_NONE));SCI_disableLoopback(mySCIB_BASE);SCI_performSoftwareReset(mySCIB_BASE);SCI_enableFIFO(mySCIB_BASE);SCI_enableModule(mySCIB_BASE);
}
通过右键 mySCIB_init()中的任意函数,并Open Declaration 可以跳转到sci.h的头文件,有助于知道有哪些函数可以使用。
使用sci.h中的函数
本篇博客先介绍如何通过SCI发送数据,sci.h中有一个使用FIFO发送character的函数,SCI_writeCharBlockingFIFO(uint32_t base, uint16_t data)。
使用该函数发送数据
//*****************************************************************************
//
//! Waits to send a character from the specified port when the FIFO enhancement
//! is enabled.
//!
//! \param base is the base address of the SCI port.
//! \param data is the character to be transmitted.
//!
//! Sends the character \e data to the transmit buffer for the specified port.
//! If there is no space available in the transmit FIFO, this function waits
//! until there is space available before returning. \e data is a uint16_t but
//! only 8 bits are written to the SCI port. SCI only transmits 8 bit
//! characters.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_writeCharBlockingFIFO(uint32_t base, uint16_t data)
{//// Check the arguments.//ASSERT(SCI_isBaseValid(base));//// Wait until space is available in the transmit FIFO.//while(SCI_getTxFIFOStatus(base) == SCI_FIFO_TX16){}//// Send a char.//HWREGH(base + SCI_O_TXBUF) = data;
}
在main.c的while(1)循环中发送数据
while(1){SCI_writeCharNonBlocking(mySCIB_BASE,UserCount);}
其中UserCout为发送的数据,博主发送的是中断计数/1000
__interrupt void INT_myEPWM1_ISR(void)
{// Verifying the ISREPwm1TimerIntCount++;if (EPwm1TimerIntCount%1000 ==0){UserCount ++;}//// Clear INT flag for this timer//EPWM_clearEventTriggerInterruptFlag(myEPWM1_BASE);//// Acknowledge the interrupt//Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);
}
使用Vofa+接收串口发送的原始数据(RawData)
1.在vofa+中设置数据引擎为RawData(图中标号①),此时把vofa+当做普通的串口调试助手来使用
2.确定端口号(图中标号②),可以看到用的USB转串口设备,博主使用的是CH343
3.设置波特率(图中标号③),上文配置波特率为115200
4.设置数据位数和停止位数(图中标号④和⑤),数据位数为8,停止位数为1
5.观察vofa+接收到的数据和SCITXBUF寄存器中的值是一致的,图中对应的为0x0037。
注意事项和Tips!
1. 注意LAUNCHXL_F28379D的外部竞争选择是否正确,否则会导致计算的Baud Rate和想设置的不一样,这会导致上位机接收不到正确的数据
2.利用board.c中调用的函数,可以跳转到相应的头文件,便于了解有哪些可以直接使用的函数
以上便完成了syscfg配置SCI串口发送数据。希望对你有所帮助,我是ManTou~