#include "SWM221.h"

void SerialInit(void);

int main(void)
{
    // 定义发送数据数组，包含8个字节
    uint8_t tx_data[8] = {1, 2, 3, 4, 5, 6, 7, 8};
    CAN_InitStructure CAN_initStruct;  // CAN初始化结构体
    CAN_RXMessage CAN_msg;            // CAN接收消息结构体
    
    SystemInit();    // 系统时钟、内存、中断等初始化
    SerialInit();    // 串口通信初始化（用于后续数据打印）
    
		GPIO_Init(GPIOA, PIN3, 1, 0, 1, 0);			//输出，MCU拉低使能
    // 初始化PORTB引脚7和8为CAN0的RX/TX功能（具体复用功能需参考芯片手册）
    // 参数：端口, 引脚号, 复用功能, 上拉/下拉使能（1-使能，0-禁用）
    PORT_Init(PORTB, PIN7, PORTB_PIN7_CAN0_RX, 1);  // CAN0接收引脚
    PORT_Init(PORTB, PIN8, PORTB_PIN8_CAN0_TX, 0);  // CAN0发送引脚
    
		
    // 配置CAN初始化参数
    CAN_initStruct.Mode = CAN_MODE_SELFTEST;     // 自测模式（需短接TX和RX）
    CAN_initStruct.CAN_bs1 = CAN_BS1_5tq;        // 位时间段1占5个时间单位
    CAN_initStruct.CAN_bs2 = CAN_BS2_4tq;        // 位时间段2占4个时间单位
    CAN_initStruct.CAN_sjw = CAN_SJW_2tq;        // 同步跳转宽度2个时间单位
    CAN_initStruct.Baudrate = 50000;             // 波特率50kbps
    CAN_initStruct.RXNotEmptyIEn = 0;            // 启用接收中断
    CAN_initStruct.ArbitrLostIEn = 0;            // 禁用仲裁丢失中断
    CAN_initStruct.ErrPassiveIEn = 0;            // 禁用错误被动中断
    CAN_Init(CAN0, &CAN_initStruct);             // 应用配置初始化CAN0
    
    // 设置CAN过滤器（32位模式）
    // 参数：CAN模块, 过滤器号, 标识符ID, 掩码（掩码0x1FFFFFFE表示允许ID最低位变化）
    // 功能：接收扩展ID为0x00122122和0x00122123的帧
    CAN_SetFilter32b(CAN0, CAN_FILTER_1, 0x00122122, 0x1FFFFFFE);
    
    // 设置CAN过滤器（16位模式）
    // 参数：CAN模块, 过滤器号, ID1, 掩码1, ID2, 掩码2
    // 功能：接收标准ID为0x122、0x123（掩码0x7FE）和0x101（掩码0x7FF）的帧
    CAN_SetFilter16b(CAN0, CAN_FILTER_2, 0x122, 0x7FE, 0x101, 0x7FF);
    
    CAN_Open(CAN0);  // 启动CAN0控制器
    
    // 发送标准数据帧（ID: 0x122, 数据长度8字节, 启用自动重传）
    CAN_Transmit(CAN0, CAN_FRAME_STD, 0x122, tx_data, 8, 1);
    while(CAN_TXComplete(CAN0) == 0) __NOP();  // 等待发送完成
    
    // 发送扩展数据帧（ID: 0x122122, 数据长度8字节, 启用自动重传）
    CAN_Transmit(CAN0, CAN_FRAME_EXT, 0x122122, tx_data, 8, 1);
    while(CAN_TXComplete(CAN0) == 0) __NOP();  // 等待发送完成
    
    // 循环读取所有接收到的CAN消息并通过串口打印
    while(CAN_RXDataAvailable(CAN0))
    {
        CAN_Receive(CAN0, &CAN_msg);  // 从缓冲区读取消息
        
        // 打印帧类型和ID
        printf("\r\nReceive %s %08X: ", 
               CAN_msg.format == CAN_FRAME_STD ? "STD" : "EXT", 
               CAN_msg.id);
        
        // 打印数据内容（十六进制格式）
        for(int i = 0; i < CAN_msg.size; i++) 
            printf("%02X, ", CAN_msg.data[i]);
    }
    
    // 主循环（保持程序运行）
    while(1==1)
    {
    }
}


/*
 * 函数名：SerialInit
 * 功能：初始化UART0串口通信
 * 参数：无
 * 返回值：无
 * 注：配置PA.0为UART0_RX（带上拉），PA.1为UART0_TX（无上拉）
 *     波特率57600，8位数据，无校验，1位停止位
 *     FIFO阈值：收发均在3字节时触发（中断未使能）
 *     接收超时时间10个单位（具体单位参考硬件手册），超时中断未使能
 */
void SerialInit(void)
{
    UART_InitStructure UART_initStruct;
    
    // 配置PA0引脚为UART0接收功能，启用上拉（参数1）
    PORT_Init(PORTA, PIN0, PORTA_PIN0_UART0_RX, 1); 
    // 配置PA1引脚为UART0发送功能，禁用上拉（参数0）
    PORT_Init(PORTA, PIN1, PORTA_PIN1_UART0_TX, 0); 
    
    // 初始化UART配置结构体
    UART_initStruct.Baudrate = 57600;       // 波特率57600bps
    UART_initStruct.DataBits = UART_DATA_8BIT; // 8位数据位
    UART_initStruct.Parity = UART_PARITY_NONE; // 无校验
    UART_initStruct.StopBits = UART_STOP_1BIT; // 1位停止位
    UART_initStruct.RXThreshold = 3;       // 接收FIFO阈值3字节
    UART_initStruct.RXThresholdIEn = 0;    // 禁用接收阈值中断
    UART_initStruct.TXThreshold = 3;       // 发送FIFO阈值3字节
    UART_initStruct.TXThresholdIEn = 0;    // 禁用发送阈值中断
    UART_initStruct.TimeoutTime = 10;      // 接收超时时间（单位依硬件而定）
    UART_initStruct.TimeoutIEn = 0;        // 禁用超时中断
    
    // 应用配置并启用UART0
    UART_Init(UART0, &UART_initStruct);    // 初始化UART0参数
    UART_Open(UART0);                      // 启动UART0通信
}

/*********************************************************************************************
* 函数名称: fputc()
* 功能说明: printf()使用此函数完成实际的串口打印动作
* 输    入: int ch		要打印的字符
*			FILE *f		文件句柄
* 输    出: 无
* 注意事项: 无
**********************************************************************************************/
int fputc(int ch, FILE *f)
{
	UART_WriteByte(UART0, ch);
	
	while(UART_IsTXBusy(UART0));
 	
	return ch;
}
