/************************************************************************

    程序名称：基于S6J3360的MFS的UART驱动程序
    设计编写：王祥福
    创建日期：20200229
    程序版本：REV 0.2
    编码规范：符合 MISRA C 2004
      
    版本修订
        REV 0.1     20200229     王祥福        创建文档
        REV 0.2     20201104     王祥富        增加校验功能
          
    设计说明
        仅仅支持S6J3360的MFS的UART模式，可以配置到不同的通道上。
    为了让CPU有更多时间处理其他事情，本驱动提供两种操作方法：即阻塞式，和
    非阻塞式的发送。
     
    使用说明
        1，先在Source\Library\Driver\cfg目录下GPIO_Config.xlsm中，配置你的RXD与TXD的GPIO
           配置TXD时，请将对应的GPIO设置为MFSn_SOT_m，这里的n为MFS的通道号(0-11)，m为IO的映射组(0-2)，并且设置默认为1，并关闭滤波器
           配置RXD时，模式为GPIO，但是需要开启输入使能，同样关闭滤波器
           同时修改本头文件中的管脚配置！！！

        2，先进行初始化
           //  必须在Interrupt_Controller_Lock();函数之前调用  
           //  因为这里面会注册中断服务函数，而上面的那句话会关闭注册
           MFS_UART_Init(9u,             //  MFS的通道9
                         115200u         //  波特率为115200bps
                         );
        3，有2中使用方法，分别为中断方式发送和阻塞方式发送
            //  测试阻塞单字节发送
            MFS_UART_SendOneByte(9u,                            //  通道9 
                                 MFS_UART_SendType_Blocking,    //  阻塞发送 
                                 'A'                            //  发送的字节  
                                 );
            
            //  前一个使用阻塞发送时，下一句话可以直接继续调用发送 
            MFS_UART_SendOneByte(9u, MFS_UART_SendType_Blocking, 'B');
            MFS_UART_SendOneByte(9u, MFS_UART_SendType_Blocking, 'C');
            
            //  测试中断方式多字节发送 
            //  多字节发送时，数据缓冲区的首地址使用常量时，可以直接书写  
            MFS_UART_SendMultiByte(9u, MFS_UART_SendType_Interrupt, "0123456789", 10u);
            //  当使用中断发送方式时，每次调用完发送后，必须确保当前通道工作完成后，再次才能调用新的发送，否则会发送失败返回忙  
            MFS_UART_WaitForSendReady(9u);    //  阻塞等待该通道发送完成 
            MFS_UART_SendMultiByte(9u, MFS_UART_SendType_Interrupt, "9876543210", 10u);
            MFS_UART_WaitForSendReady(9u);    //  阻塞等待该通道发送完成 
            
            //  阻塞发送多字节 
            MFS_UART_SendMultiByte(9u, MFS_UART_SendType_Blocking, "ABCDEFG", 7u);
            
            //  发送变量类型的数据，必须使用全局变量！！因为这里没有使用缓冲区，而是直接用的你传入的指针，如果是临时变量，
            // 当退出函数 或者 该变量的生命周期结束后，将导致内存被释放，从而引起数据错误，或者进入异常中断！！
            // 但是阻塞发送不涉及该问题，因为阻塞发送时，函数处于发送中，变量的生命周期不会提前结束
            // 而中断发送，调用以后会立即返回，此时如果退出函数，就会导致该问题           
            unsigned char send_dat[5];    //  这里要定义成全局变量 或者 static静态变量
            send_dat[0] = 0x12u;
            send_dat[1] = 0x23u;
            send_dat[2] = 0x34u;
            send_dat[3] = 0x45u;
            send_dat[4] = 0x56u;
            //  中断发送多字节  
            //  静态长度的数组，可以使用sizeof，因为它的长度在编译阶段，编译器是已知的  
            MFS_UART_SendMultiByte(9u, MFS_UART_SendType_Interrupt, send_dat, sizeof(send_dat));
            MFS_UART_WaitForSendReady(9u);    //  阻塞等待该通道发送完成  

        4，接收时，驱动程序会自动调用回调函数，用户可以在回调函数中自行添加解析内容

        5，当用户的管脚配置出现错误时，会死循环在MFS_UART_ConfigError回调函数中
          
        6，在MISRA-C-2004标准中，不允许使用可变参数函数，所以不能使用printf格式化功能
           不过您可以在非MISRA-C标准的代码中使用该功能！！
           使用printf时，您必须调用本文件中的MFS_UART_printf函数！！
           并且使用中断方式发送时，由于只有1个缓冲区，即同一个时刻只能有一个通道使用格式化打印功能！！
           并且上不支持浮点数的打印，需要用户自行转换为整数格式

      
    设计参考
        [1]  002-07884_32-BIT_MICROCONTROLLER_TRAVEO_TM_FAMILY_HARDWARE_MANUAL_PLATFORM_PART
        [2]  Template project for S6J3360 源码
        [3]  https://www.cnblogs.com/camellia3371----/p/11603273.html  [UART协议详解]
        [4]  https://wenku.baidu.com/view/4e23256027d3240c8447ef59.html  [不归零编码NRZ]
        [5]  002-18302_32-BIT_MICROCONTROLLER_S6J3360_S6J3370_SERIES_HARDWARE_MANUAL_TRAVEO_TM_FAMILY
        [6]  https://blog.csdn.net/wangbenqiang/article/details/67635038  [const的位置与区别]
        [7]  AN202495_Using_the_Multifunction_Serial_Interface_of_the_Traveo_Family

************************************************************************/
/*---------------------------------------------------------------------*/
/*  重定义保护  */
#ifndef __MFS_UART_H__
#define __MFS_UART_H__

/*---------------------------------------------------------------------*/
/*  包含头文件  */
#include "s6j3360_MFS_UART.h"                   /*  Cypress官方MFS的UART的头文件  */
#include "Clock_Config.h"                       /*  时钟配置  */
#include "interrupts.h"                         /*  中断相关  */

/*---------------------------------------------------------------------*/
/*  相关宏定义  */
/*  printf打印支持  */
#define MFS_UART_PRINTF_EN                      0u       /*  0=开启  1=关闭  */
#define MFS_UART_PRINTF_BUF_SIZE              200u       /*  printf一次执行最长的字符串长度-1  */

/*  中断优先级设置  */
#define MFS_UART_IRQ_PRIORITY__CH0_RX          31u       /*  通道0，接收  */
#define MFS_UART_IRQ_PRIORITY__CH1_RX          31u       /*  通道1，接收  */
#define MFS_UART_IRQ_PRIORITY__CH2_RX          31u       /*  通道2，接收  */
#define MFS_UART_IRQ_PRIORITY__CH3_RX          31u       /*  通道3，接收  */
#define MFS_UART_IRQ_PRIORITY__CH4_RX          31u       /*  通道4，接收  */
#define MFS_UART_IRQ_PRIORITY__CH5_RX          31u       /*  通道5，接收  */
#define MFS_UART_IRQ_PRIORITY__CH6_RX          31u       /*  通道6，接收  */
#define MFS_UART_IRQ_PRIORITY__CH7_RX          31u       /*  通道7，接收  */
#define MFS_UART_IRQ_PRIORITY__CH8_RX          31u       /*  通道8，接收  */
#define MFS_UART_IRQ_PRIORITY__CH9_RX          31u       /*  通道9，接收  */
#define MFS_UART_IRQ_PRIORITY__CH10_RX         31u       /*  通道10，接收  */
#define MFS_UART_IRQ_PRIORITY__CH11_RX         31u       /*  通道11，接收  */
#define MFS_UART_IRQ_PRIORITY__CH0_TX          31u       /*  通道0，发送  */
#define MFS_UART_IRQ_PRIORITY__CH1_TX          31u       /*  通道1，发送  */
#define MFS_UART_IRQ_PRIORITY__CH2_TX          31u       /*  通道2，发送  */
#define MFS_UART_IRQ_PRIORITY__CH3_TX          31u       /*  通道3，发送  */
#define MFS_UART_IRQ_PRIORITY__CH4_TX          31u       /*  通道4，发送  */
#define MFS_UART_IRQ_PRIORITY__CH5_TX          31u       /*  通道5，发送  */
#define MFS_UART_IRQ_PRIORITY__CH6_TX          31u       /*  通道6，发送  */
#define MFS_UART_IRQ_PRIORITY__CH7_TX          31u       /*  通道7，发送  */
#define MFS_UART_IRQ_PRIORITY__CH8_TX          31u       /*  通道8，发送  */
#define MFS_UART_IRQ_PRIORITY__CH9_TX          31u       /*  通道9，发送  */
#define MFS_UART_IRQ_PRIORITY__CH10_TX         31u       /*  通道10，发送  */
#define MFS_UART_IRQ_PRIORITY__CH11_TX         31u       /*  通道11，发送  */

/*---------------------------------------------------------------------*/
/*  串口的pin脚路由配置  */
/*  所定义的值为PIN脚的号码，这里采用的是LQFP-144封装  */
/*  通道0，该通道有1个CS0                                        组0配置          组1配置      UART/LIN   SPI   I2C  */
#define MFS_UART_CH0_SCK                       83u       /*  0=P1_13=83pin   1=P2_28=142pin    ---      SCK   ---  */
#define MFS_UART_CH0_SIN                       84u       /*  0=P1_14=84pin   1=P2_29=143pin    RXD      MISO  ---  */
#define MFS_UART_CH0_SOT                       82u       /*  0=P1_12=82pin   1=P2_27=141pin    TXD      MOSI  ---  */
#define MFS_UART_CH0_CS0                       85u       /*  0=P1_15=85pin   1=P2_26=140pin    ---      CS0   ---  */
#define MFS_UART_CH0_SDA                       50u       /*  芯片硬件固定  P0_25=50pin          ---      ---   SDA  */
#define MFS_UART_CH0_SCL                       51u       /*  芯片硬件固定  P0_26=51pin          ---      ---   SCL  */
#define MFS_UART_CH0_ALLPIN_DCS                 0u       /*  全部该通道管脚的输出电流能力配置,参考资源[5]第213页      */
#define MFS_UART_CH0_ALLPIN_ILS                 0u       /*  全部该通道管脚的输入等级配置，参考资源[5]第209页         */

/*  通道1，该通道有4个CS，分别为CS0，CS1，CS2，CS3                组0配置          组1配置      UART/LIN   SPI   I2C  */
#define MFS_UART_CH1_SCK                      138u       /*  0=P2_24=138pin  1=P0_04=6pin      ---      SCK  [SCL] */
#define MFS_UART_CH1_SIN                      139u       /*  0=P2_25=139pin  1=P0_05=7pin      RXD      MISO  ---  */
#define MFS_UART_CH1_SOT                      137u       /*  0=P2_23=137pin  1=P0_03=5pin      TXD      MOSI [SDA] */
#define MFS_UART_CH1_CS0                      140u       /*  0=P2_26=140pin  1=P0_06=8pin      ---      CS0   ---  */
#define MFS_UART_CH1_CS1                      141u       /*  0=P2_27=141pin  本封装无该配置     ---      CS1   ---  */
#define MFS_UART_CH1_CS2                      142u       /*  0=P2_28=142pin  本封装无该配置     ---      CS2   ---  */
#define MFS_UART_CH1_CS3                      143u       /*  0=P2_29=143pin  本封装无该配置     ---      CS3   ---  */
#define MFS_UART_CH1_SDA                      137u       /*  芯片硬件固定  P2_23=137pin         ---     [MOSI] SDA  */
#define MFS_UART_CH1_SCL                      138u       /*  芯片硬件固定  P2_24=138pin         ---     [SCK]  SCL  */
#define MFS_UART_CH1_ALLPIN_DCS                 0u       /*  全部该通道管脚的输出电流能力配置,参考资源[5]第213页      */
#define MFS_UART_CH1_ALLPIN_ILS                 0u       /*  全部该通道管脚的输入等级配置，参考资源[5]第209页         */

/*  通道2，该通道有4个CS，分别为CS0，CS1，CS2，CS3，无I2C         组0配置          组1配置      UART/LIN   SPI   I2C  */
#define MFS_UART_CH2_SCK                       20u       /*  0=P0_14=20pin   1=P2_05=115pin    ---      SCK   ---  */
#define MFS_UART_CH2_SIN                       21u       /*  0=P0_15=21pin   1=P2_06=116pin    RXD      MISO  ---  */
#define MFS_UART_CH2_SOT                       19u       /*  0=P0_13=19pin   1=P2_04=114pin    TXD      MOSI  ---  */
#define MFS_UART_CH2_CS0                       22u       /*  0=P0_16=22pin   1=P2_07=117pin    ---      CS0   ---  */
#define MFS_UART_CH2_CS1                       23u       /*  0=P0_17=23pin   1=P2_08=118pin    ---      CS1   ---  */
#define MFS_UART_CH2_CS2                       26u       /*  0=P0_18=26pin   本封装无该配置     ---      CS2   ---  */
#define MFS_UART_CH2_CS3                       28u       /*  0=P0_19=28pin   本封装无该配置     ---      CS3   ---  */
#define MFS_UART_CH2_ALLPIN_DCS                 0u       /*  全部该通道管脚的输出电流能力配置,参考资源[5]第213页      */
#define MFS_UART_CH2_ALLPIN_ILS                 0u       /*  全部该通道管脚的输入等级配置，参考资源[5]第209页         */

/*  通道3，该通道有4个CS，分别为CS0，CS1，CS2，CS3，无I2C         组0配置          组1配置      UART/LIN   SPI   I2C  */
#define MFS_UART_CH3_SCK                       30u       /*  0=P0_21=30pin   1=P2_10=122pin    ---      SCK   ---  */
#define MFS_UART_CH3_SIN                       31u       /*  0=P0_22=31pin   1=P2_11=123pin    RXD      MISO  ---  */
#define MFS_UART_CH3_SOT                       29u       /*  0=P0_20=29pin   1=P2_09=121pin    TXD      MOSI  ---  */
#define MFS_UART_CH3_CS0                       32u       /*  0=P0_23=32pin   1=P2_12=124pin    ---      CS0   ---  */
#define MFS_UART_CH3_CS1                       35u       /*  0=P0_24=35pin   1=P2_13=125pin    ---      CS1   ---  */
#define MFS_UART_CH3_CS2                      126u       /*  本封装无该配置   1=P2_14=126pin    ---      CS2   ---  */
#define MFS_UART_CH3_CS3                      127u       /*  本封装无该配置   1=P2_15=127pin    ---      CS3   ---  */
#define MFS_UART_CH3_ALLPIN_DCS                 0u       /*  全部该通道管脚的输出电流能力配置,参考资源[5]第213页      */
#define MFS_UART_CH3_ALLPIN_ILS                 0u       /*  全部该通道管脚的输入等级配置，参考资源[5]第209页         */

/*  通道4，该通道有4个CS，分别为CS0，CS1，CS2，CS3                组0配置          组1配置      UART/LIN   SPI   I2C  */
#define MFS_UART_CH4_SCK                      129u       /*  0=P2_17=129pin  1=P0_08=12pin     ---      SCK  [SCL] */
#define MFS_UART_CH4_SIN                      130u       /*  0=P2_18=130pin  1=P0_09=13pin     RXD      MISO  ---  */
#define MFS_UART_CH4_SOT                      128u       /*  0=P2_16=128pin  1=P0_07=11pin     TXD      MOSI [SDA] */
#define MFS_UART_CH4_CS0                      131u       /*  0=P2_19=131pin  1=P0_10=14pin     ---      CS0   ---  */
#define MFS_UART_CH4_CS1                      132u       /*  0=P2_20=132pin  1=P0_11=15pin     ---      CS1   ---  */
#define MFS_UART_CH4_CS2                      133u       /*  0=P2_21=133pin  1=P0_12=16pin     ---      CS2   ---  */
#define MFS_UART_CH4_CS3                      136u       /*  0=P2_22=136pin  本封装无该配置     ---      CS3   ---  */
#define MFS_UART_CH4_SDA                      128u       /*  芯片硬件固定  P2_16=128pin         ---     [MOSI] SDA  */
#define MFS_UART_CH4_SCL                      129u       /*  芯片硬件固定  P2_17=129pin         ---     [SCK]  SCL  */
#define MFS_UART_CH4_ALLPIN_DCS                 0u       /*  全部该通道管脚的输出电流能力配置,参考资源[5]第213页      */
#define MFS_UART_CH4_ALLPIN_ILS                 0u       /*  全部该通道管脚的输入等级配置，参考资源[5]第209页         */

/*  通道5，该通道有1个CS0                                        组0配置          组1配置      UART/LIN   SPI   I2C  */
#define MFS_UART_CH5_SCK                      105u       /*  0=P1_31=105pin  本封装无该配置     ---      SCK   SCL  */
#define MFS_UART_CH5_SIN                      106u       /*  0=P2_00=106pin  本封装无该配置     RXD      MISO  ---  */
#define MFS_UART_CH5_SOT                      104u       /*  0=P1_30=104pin  本封装无该配置     TXD      MOSI  SDA  */
#define MFS_UART_CH5_CS0                      107u       /*  0=P2_01=107pin  本封装无该配置     ---      CS0   ---  */
#define MFS_UART_CH5_SDA                      104u       /*  芯片硬件固定  P1_30=104pin         TXD      ---   SDA  */
#define MFS_UART_CH5_SCL                      105u       /*  芯片硬件固定  P1_31=105pin         ---      SCK   SCL  */
#define MFS_UART_CH5_ALLPIN_DCS                 0u       /*  全部该通道管脚的输出电流能力配置,参考资源[5]第213页      */
#define MFS_UART_CH5_ALLPIN_ILS                 0u       /*  全部该通道管脚的输入等级配置，参考资源[5]第209页         */

/*  通道6，该通道有2个CS，分别为CS0，CS1                          组0配置          组1配置      UART/LIN   SPI   I2C  */
#define MFS_UART_CH6_SCK                       63u       /*  芯片硬件固定  P1_03=63pin          ---      SCK   SCL  */
#define MFS_UART_CH6_SIN                       64u       /*  芯片硬件固定  P1_04=64pin          RXD      MISO  ---  */
#define MFS_UART_CH6_SOT                       62u       /*  芯片硬件固定  P1_02=62pin          TXD      MOSI  SDA  */
#define MFS_UART_CH6_CS0                       56u       /*  芯片硬件固定  P0_30=56pin          ---      CS0   ---  */
#define MFS_UART_CH6_CS1                       57u       /*  芯片硬件固定  P0_31=57pin          ---      CS1   ---  */
#define MFS_UART_CH6_SDA                       62u       /*  芯片硬件固定  P1_02=62pin          TXD      ---   SDA  */
#define MFS_UART_CH6_SCL                       63u       /*  芯片硬件固定  P1_03=63pin          ---      SCK   SCL  */
#define MFS_UART_CH6_ALLPIN_DCS                 0u       /*  全部该通道管脚的输出电流能力配置,参考资源[5]第213页      */
#define MFS_UART_CH6_ALLPIN_ILS                 0u       /*  全部该通道管脚的输入等级配置，参考资源[5]第209页         */

/*  通道7，该通道有2个CS，分别为CS0，CS1                          组0配置          组1配置      UART/LIN   SPI   I2C  */
#define MFS_UART_CH7_SCK                       66u       /*  0=P1_06=66pin   1=P0_01=3pin      ---      SCK  [SCL] */
#define MFS_UART_CH7_SIN                       67u       /*  0=P1_07=67pin   1=P0_02=4pin      RXD      MISO  ---  */
#define MFS_UART_CH7_SOT                       65u       /*  0=P1_05=65pin   1=P0_00=2pin      TXD      MOSI [SDA] */
#define MFS_UART_CH7_CS0                       74u       /*  芯片硬件固定  P1_08=74pin          ---      CS0   ---  */
#define MFS_UART_CH7_CS1                       77u       /*  芯片硬件固定  P1_09=77pin          ---      CS1   ---  */
#define MFS_UART_CH7_SDA                       65u       /*  芯片硬件固定  P1_05=65pin          ---     [MOSI] SDA  */
#define MFS_UART_CH7_SCL                       66u       /*  芯片硬件固定  P1_06=66pin          ---     [SCK]  SCL  */
#define MFS_UART_CH7_ALLPIN_DCS                 0u       /*  全部该通道管脚的输出电流能力配置,参考资源[5]第213页      */
#define MFS_UART_CH7_ALLPIN_ILS                 0u       /*  全部该通道管脚的输入等级配置，参考资源[5]第209页         */

/*  通道8，该通道有1个CS0                                        组0配置          组1配置          组2配置      UART/LIN   SPI   I2C  */
#define MFS_UART_CH8_SCK                       51u       /*  0=P0_26=51pin   本封装无该配置   2=P0_20=29pin     ---      SCK   ---  */
#define MFS_UART_CH8_SIN                       52u       /*  0=P0_27=52pin   本封装无该配置   2=P0_21=30pin     RXD      MISO  ---  */
#define MFS_UART_CH8_SOT                       50u       /*  0=P0_25=50pin   本封装无该配置   2=P0_19=28pin     TXD      MOSI  ---  */
#define MFS_UART_CH8_CS0                       53u       /*  0=P0_28=53pin   本封装无该配置   2=P0_22=31pin     ---      CS0   ---  */
#define MFS_UART_CH8_SDA                       82u       /*  芯片硬件固定  P1_12=82pin                          ---      ---   SDA  */
#define MFS_UART_CH8_SCL                       83u       /*  芯片硬件固定  P1_13=83pin                          ---      ---   SCL  */
#define MFS_UART_CH8_ALLPIN_DCS                 0u       /*  全部该通道管脚的输出电流能力配置,参考资源[5]第213页      */
#define MFS_UART_CH8_ALLPIN_ILS                 0u       /*  全部该通道管脚的输入等级配置，参考资源[5]第209页         */

/*  通道9，该通道有2个CS，分别为CS0，CS1                          组0配置          组1配置          组2配置      UART/LIN   SPI   I2C  */
#define MFS_UART_CH9_SCK                       91u       /*  0=P1_19=91pin   本封装无该配置   2=P0_14=20pin     ---       SCK  [SCL] */
#define MFS_UART_CH9_SIN                       21u       /*  0=P1_20=92pin   本封装无该配置   2=P0_15=21pin     RXD       MISO  ---  */
#define MFS_UART_CH9_SOT                       90u       /*  0=P1_18=90pin   本封装无该配置   2=P0_13=19pin     TXD       MOSI [SDA] */
#define MFS_UART_CH9_CS0                       86u       /*  0=P1_16=86pin   本封装无该配置   2=P0_16=22pin     ---       CS0   ---  */
#define MFS_UART_CH9_CS1                       87u       /*  0=P1_17=87pin   本封装无该配置   2=P0_17=23pin     ---       CS1   ---  */
#define MFS_UART_CH9_SDA                       90u       /*  芯片硬件固定  P1_18=90pin                          ---      [MOSI] SDA  */
#define MFS_UART_CH9_SCL                       91u       /*  芯片硬件固定  P1_19=91pin                          ---      [SCK]  SCL  */
#define MFS_UART_CH9_ALLPIN_DCS                 0u       /*  全部该通道管脚的输出电流能力配置,参考资源[5]第213页      */
#define MFS_UART_CH9_ALLPIN_ILS                 0u       /*  全部该通道管脚的输入等级配置，参考资源[5]第209页         */

/*  通道10，该通道有1个CS0                                       组0配置          组1配置      UART/LIN   SPI   I2C  */
#define MFS_UART_CH10_SCK                      94u       /*  0=P1_22=94pin   本封装无该配置     ---      SCK  [SCL] */
#define MFS_UART_CH10_SIN                      95u       /*  0=P1_23=95pin   本封装无该配置     RXD      MISO  ---  */
#define MFS_UART_CH10_SOT                      93u       /*  0=P1_21=93pin   本封装无该配置     TXD      MOSI [SDA] */
#define MFS_UART_CH10_CS0                      96u       /*  0=P1_24=96pin   本封装无该配置     ---      CS0   ---  */
#define MFS_UART_CH10_SDA                      93u       /*  芯片硬件固定  P1_21=93pin          ---     [MOSI] SDA  */
#define MFS_UART_CH10_SCL                      66u       /*  芯片硬件固定  P1_22=94pin          ---     [SCK]  SCL  */
#define MFS_UART_CH10_ALLPIN_DCS                0u       /*  全部该通道管脚的输出电流能力配置,参考资源[5]第213页      */
#define MFS_UART_CH10_ALLPIN_ILS                0u       /*  全部该通道管脚的输入等级配置，参考资源[5]第209页         */

/*  通道11，该通道有2个CS，分别为CS0，CS1                         组0配置          组1配置      UART/LIN   SPI   I2C  */
#define MFS_UART_CH11_SCK                     102u       /*  芯片硬件固定  P1_28=102pin         ---      SCK   SCL  */
#define MFS_UART_CH11_SIN                     103u       /*  芯片硬件固定  P1_29=103pin         RXD      MISO  ---  */
#define MFS_UART_CH11_SOT                     101u       /*  芯片硬件固定  P1_27=101pin         TXD      MOSI  SDA  */
#define MFS_UART_CH11_CS0                      97u       /*  芯片硬件固定  P1_25=97pin          ---      CS0   ---  */
#define MFS_UART_CH11_CS1                      96u       /*  芯片硬件固定  P1_24=96pin          ---      CS1   ---  */
#define MFS_UART_CH11_SDA                     101u       /*  芯片硬件固定  P1_27=101pin         TXD      ---   SDA  */
#define MFS_UART_CH11_SCL                     102u       /*  芯片硬件固定  P1_28=102pin         ---      SCK   SCL  */
#define MFS_UART_CH11_ALLPIN_DCS                0u       /*  全部该通道管脚的输出电流能力配置,参考资源[5]第213页      */
#define MFS_UART_CH11_ALLPIN_ILS                0u       /*  全部该通道管脚的输入等级配置，参考资源[5]第209页         */


/*---------------------------------------------------------------------*/
/*  相关数据类型定义  */
/*  操作状态  */
typedef enum
{
    MFS_UART_OptSt_OK = 0,      /*  操作完成  */
    MFS_UART_OptSt_BUSY,        /*  当前忙  */
}EMFS_UART_OptSt;

/*  串口发送的类型  */
typedef enum
{
    MFS_UART_SendType_Blocking = 0,       /*  阻塞发送，选择该模式时，调用发送函数会等待全部数据发送完毕才会返回  */
    MFS_UART_SendType_Interrupt,          /*  中断发送，选择该模式时，调用发送函数会立刻返回，用户可以通过MFS_UART_IsSendBusy函数获取当前该通道的发送进度  */
}EMFS_UART_SendType;

/*  校验类型  */
typedef enum
{
    MFS_UART_NoneParity = 0,         /*  无校验  */
    MFS_UART_OddParity,              /*  奇校验  */
    MFS_UART_EvenParity,             /*  偶校验  */ 
}EMFS_UART_ParityType;

/*---------------------------------------------------------------------*/
/*  C++兼容  */
#ifdef __cplusplus
extern "C"
{
#endif


/*---------------------------------------------------------------------*/
/*  导出函数  */
/*  初始化  */
/*  参数 channel 为通道号：0 到 11  */
/*  参数 baud 为波特率  */
void MFS_UART_Init(unsigned int channel, unsigned int baud);

/*  初始化,带有校验设置  */
/*  参数 channel 为通道号：0 到 11  */
/*  参数 baud 为波特率  */
/*  参数 parity_type 为校验类型  */
void MFS_UART_InitWithParity(unsigned int channel, unsigned int baud, EMFS_UART_ParityType parity_type);

/*  发送一个字节  */
/*  参数 channel 为通道号：0 到 11  */
/*  参数：type是发送类型，为MFS_UART_SendType_Blocking是阻塞，为MFS_UART_SendType_Interrupt是中断  */
/*  参数 in 为你要发送的字节数据  */
/*  返回值：MFS_UART_OptSt_OK=发送成功， MFS_UART_OptSt_BUSY=发送忙中*/
EMFS_UART_OptSt MFS_UART_SendOneByte(unsigned int channel, EMFS_UART_SendType type, unsigned char in);

/*  获取发送的忙状态，即发送是忙着呢吗？  */
/*  参数 channel 为通道号：0 到 11  */
/*  返回值：MFS_UART_OptSt_OK=发送空闲， MFS_UART_OptSt_BUSY=发送忙中*/
EMFS_UART_OptSt MFS_UART_IsSendBusy(unsigned int channel);

/*  阻塞等待发送忙完，即发送准备好了  */
/*  参数 channel 为通道号：0 到 11  */
void MFS_UART_WaitForSendReady(unsigned int channel);

/*  发送多个字节  */
/*  参数 channel 为通道号：0 到 11  */
/*  参数：type是发送类型，为MFS_UART_SendType_Blocking是阻塞，为MFS_UART_SendType_Interrupt是中断  */
/*  参数：pdat是用户待发送数据的指针，注意！！该指针在为中断发送时，必须是可以全局访问的！！并且注意该缓冲区的生命周期！！！  */
/*  参数：len是要发送的长度  */
/*  返回值：MFS_UART_OptSt_OK=发送成功， MFS_UART_OptSt_BUSY=发送忙中*/
EMFS_UART_OptSt MFS_UART_SendMultiByte(unsigned int channel, EMFS_UART_SendType type, unsigned char* pdat, unsigned int len);

#if MFS_UART_PRINTF_EN
/*  printf格式化打印输出  */
/*  参数 channel 为通道号：0 到 11  */
/*  参数：type是发送类型，为MFS_UART_SendType_Blocking是阻塞，为MFS_UART_SendType_Interrupt是中断  */
/*  后面参数兼容标准ANSI C的printf，但不建议使用浮点！！  */
void MFS_UART_printf(unsigned int channel, EMFS_UART_SendType type, char* str, ...);
#endif  /*  MFS_UART_PRINTF_EN  */
  
/*---------------------------------------------------------------------*/
/*  C++兼容  */
#ifdef __cplusplus
}
#endif

/*---------------------------------------------------------------------*/
#endif  /*  __MFS_UART_H__  */

/*  文件结束 MFS_UART.h  */
