#include <Myproject.h>

// 1 / 115200 * 640 *1000 ≈ 5.6 ms
uint8_t xdata DebugDat[64] = {0};


/**
    @function     UART1_Init
    @brief        调试串口配置
    @date         2025-11-05
*/
void UART1_Init(void)
{
    // 使能端口 P05 P06 复用为串口
    SetBit(PH_SEL, UART1EN);
    // 模式1 全/半双工模式
    UT_MOD1 = 0;
    UT_MOD0 = 1;
    // 多机通讯关闭
    SM2 = 0;
    // 允许接收
    REN = 1;
    // 关闭中断
    ES0 = 0;
    // 优先级配置为最低
    ClrBit(IP3, PI2C_UT11 | PI2C_UT10);
    // 波特率配置
    // 参考波特率 115200 --> 0x0C 9600 --> 0x9B
    UT_BAUD = 0x0C;
    // DMA发送配置
    Conf_DMA(0, XDATA_UART1, DebugDat, 64);
    ES0 = 1;
}


void UART2_Init(void)
{
    SetBit(PH_SEL, UART2EN);
    /*  UART模式 UT2_MOD1,UT2_MOD0为:
        00  模式0，移位寄存器波特率为 系统时钟 /12
        01  模式1，8-bit UART 波特率为 fcpu_clk / ( (16 / (1+ UT2_BAUD[BAUD2_SEL]) ) / (UT2_BAUD+1) )
        10  模式2，9-bit UART 波特率为 fcpu_clk / ( 32 – 16* UT2_BAUD[BAUD2_SEL])
        11  模式3，9-bit UART 波特率为 fcpu_clk / ( (16 / (1+ UT2_BAUD[BAUD2_SEL])) / (UT2_BAUD+1) )   */
    UT2MOD1 = 0;                // 9位模式    01
    UT2MOD0 = 1;
    /* Does not allow multi-thread cpu operation */
    /* UT2_SM2 为 0 - 单机通讯为 1 - 多机通讯 */
    UT2SM2 = 0;
    /* UT2_REN 为 0 - 禁止接收为 1 - 使能接收 */
    UT2REN = 1;
    UT2RI = 0;
    /* Uart2设置中断优先级 */
    SetBit(IP3, PSPI_UT21);
    ClrBit(IP3, PSPI_UT20);
    // UART2CH1, UART2CH0
    // 00：P3.6 为 RXD、P3.7 为 TXD（P3.6 为单线模式的输入输出）
    // 01：P4.7 为 RXD、P1.2 为 TXD（P1.2 为单线模式的输入输出）
    // 1X：P0.1 为 RXD、P0.0 为 TXD（P0.1 为单线模式的输入输出）
    ClrBit(PH_SEL1, UART2CH1);
    ClrBit(PH_SEL1, UART2CH0);
    // 设置波特率 根据 fcpu_clk / ( (16 / (1+ UT2_BAUD[BAUD2_SEL]) ) / (UT2_BAUD+1) )计算
    UT2_BAUD |= 1500000 / 9600 - 1;
    // SetBit(UT2_BAUD,BAUD2_SEL);
    SetBit(UT2_BAUD, UART2IEN);
}




/**
    @function     Dabug_Data_Update
    @brief        调试信息上载 !高字节在前
    @date         2025-11-05
*/
void Dabug_Data_Update(void)
{
    static uint8_t update_delay_cnt = 0;
    uint8_t sumcheck = 0, addcheck = 0;
    uint16_t i = 0, switchTemp = 0;
    
    if (++ update_delay_cnt > 9)
    {
        update_delay_cnt = 0;
        *(_IO uint16_t xdata *)(&DebugDat +  0) = 0xABFF;
        *(_IO uint16_t xdata *)(&DebugDat +  2) = 0xFFF1;
        *(_IO uint16_t xdata *)(&DebugDat +  4) = 0x3800;
        *(_IO uint16_t xdata *)(&DebugDat +  6) = (currOffset.IuOffset >> 8) | (currOffset.IuOffset << 8);
        *(_IO uint16_t xdata *)(&DebugDat +  8) = (currOffset.IvOffset >> 8) | (currOffset.IvOffset << 8);
        *(_IO uint16_t xdata *)(&DebugDat + 10) = (motorControl.DCBus >> 8) | (motorControl.DCBus << 8);
        switchTemp = (uint16_t)FOC__ID;
        *(_IO uint16_t xdata *)(&DebugDat + 12) = (switchTemp >> 8) | (switchTemp << 8);
        switchTemp = (uint16_t)FOC__IQ;
        *(_IO uint16_t xdata *)(&DebugDat + 14) = (switchTemp >> 8) | (switchTemp << 8);
        switchTemp = (uint16_t)FOC__IA;
        *(_IO uint16_t xdata *)(&DebugDat + 16) = (switchTemp >> 8) | (switchTemp << 8);
        switchTemp = (uint16_t)FOC__IB;
        *(_IO uint16_t xdata *)(&DebugDat + 18) = (switchTemp >> 8) | (switchTemp << 8);
        switchTemp = (uint16_t)FOC__IC;
        *(_IO uint16_t xdata *)(&DebugDat + 20) = (switchTemp >> 8) | (switchTemp << 8);
        switchTemp = (uint16_t)FOC_IDREF;
        *(_IO uint16_t xdata *)(&DebugDat + 22) = (switchTemp >> 8) | (switchTemp << 8);
        switchTemp = (uint16_t)FOC_IQREF;
        *(_IO uint16_t xdata *)(&DebugDat + 24) = (switchTemp >> 8) | (switchTemp << 8);
        switchTemp = (uint16_t)motorControl.ActualSpeed;
        *(_IO uint16_t xdata *)(&DebugDat + 26) = (switchTemp >> 8) | (switchTemp << 8);
        
        // 计算校验
        for (i = 0; i < 62; i++)
        {
            sumcheck += DebugDat[i];
            addcheck += sumcheck;
        }
        
        //将计算出来的校验数据写入数据帧
        DebugDat[62] = sumcheck;
        DebugDat[63] = addcheck;
        Set_DMA_Data_Package(0, DebugDat, 0x40);
        Switch_DMA(0);
    }
}
