|
|
#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;
|
|
|
}
|