/*
 * sci.c
 *
 *  Created on: 2023年6月23日
 *      Author: wdh19
 */

#include "sci.h"

__interrupt void SCIA_RXFIFOISR(void)
{
    uint16_t i;
    SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_RXFF);
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);

    while(SCI_getRxFIFOStatus(SCIA_BASE)!=SCI_FIFO_RX0)
    {
        i=SCI_readCharNonBlocking(SCIA_BASE);
        SCI_writeCharBlockingFIFO(SCIA_BASE,i);
    }

}

void Board_init()
{
    EALLOW;

    PinMux_init();//GPIO的配置
    SCI_init();

    EDIS;
}

//*****************************************************************************
//
// PINMUX 配置
//
//*****************************************************************************
void PinMux_init()
{
    //
    // 分配给CPU1的模块的PinMux
    //
    //
    // SCIA -> mySCI0 Pinmux
    //
    GPIO_setMasterCore(mySCI0_SCIRX_GPIO, GPIO_CORE_CPU1);//配置控制核心为CPU1
    GPIO_setPinConfig(mySCI0_SCIRX_PIN_CONFIG);//配置片内外设
    GPIO_setPadConfig(mySCI0_SCIRX_GPIO, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(mySCI0_SCIRX_GPIO, GPIO_QUAL_ASYNC);//无采样滤波

    GPIO_setMasterCore(mySCI0_SCITX_GPIO, GPIO_CORE_CPU1);//配置控制核心为CPU1
    GPIO_setPinConfig(mySCI0_SCITX_PIN_CONFIG);//配置片内外设
    GPIO_setPadConfig(mySCI0_SCITX_GPIO, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(mySCI0_SCITX_GPIO, GPIO_QUAL_ASYNC);//无采样滤波


}

//*****************************************************************************
//
// SCI Configurations
//
//*****************************************************************************
void SCI_init(){
    mySCI0_init();
}

void mySCI0_init(){
    //配置SCI
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIA);//使能相应时钟，打开外设

    //一些初始化操作
    //清除所有SCI中断源
    SCI_clearInterruptStatus(mySCI0_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);
    //清除接收FIFO溢出标志状态
    SCI_clearOverflowStatus(mySCI0_BASE);
    SCI_resetTxFIFO(mySCI0_BASE);//复位TX FIFO
    SCI_resetRxFIFO(mySCI0_BASE);//复位RX FIFO
    SCI_resetChannels(mySCI0_BASE);//重置SCI发送和接收通道

    // 配置SCIA参数
    SCI_setConfig(mySCI0_BASE, DEVICE_LSPCLK_FREQ, mySCI0_BAUDRATE, (SCI_CONFIG_WLEN_8|SCI_CONFIG_STOP_ONE|SCI_CONFIG_PAR_NONE));
    //执行一个软件复位的SCI和清除所有报告的接收器状态标志。
    SCI_performSoftwareReset(mySCI0_BASE);// 初始化SCIA及其FIFO

    //配置FIFO
    SCI_setFIFOInterruptLevel(mySCI0_BASE, SCI_FIFO_TX2, SCI_FIFO_RX1);//配置FIFO
    SCI_enableFIFO(mySCI0_BASE);////使能SCIA_FIFO
    //使能 SCI
    SCI_enableModule(mySCI0_BASE);//使能发送和接收。

    //配置中断
    Interrupt_register(INT_SCIA_RX, SCIA_RXFIFOISR);        //注册SCIA_RX
    SCI_enableInterrupt(SCIA_BASE, SCI_INT_RXFF);           //使能RX_FIFO中断
    SCI_disableInterrupt(SCIA_BASE, SCI_INT_RXERR);         //失能RX_ERR中断
    Interrupt_enable(INT_SCIA_RX);                          //使能SCIA中断
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);          //清除GROUP9请求

}





