You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
4.6 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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无上拉
* 波特率576008位数据无校验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;
}