我使用EVT中的CAN/testdemo文件夾中的回環(huán)模式進(jìn)行測(cè)試,能測(cè)試通過。我自己寫的程序中只能發(fā)送數(shù)據(jù),不能接收數(shù)據(jù),是我的程序中對(duì)CAN的初始化哪里不正確還是我的接收程序不對(duì),以及是否還有其它什么原因?使用CAN分析儀查看正確接收到來自單片機(jī)的數(shù)據(jù),向單片機(jī)發(fā)送的數(shù)據(jù)也是成功了的
以下是我的初始化代碼
/*
*********************************************************************************************************
*? ?模塊名稱 : can驅(qū)動(dòng)模塊
*? ?文件名稱 : bsp_can.c
*? ?說? ? 明 : 驅(qū)動(dòng)can接口
*? ?修改記錄 :
*********************************************************************************************************
*/
#include "../bsp.h"
/*
*********************************************************************************************************
*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?宏定義
*********************************************************************************************************
*/
/* CAN1時(shí)鐘 */
#define CAN1_CLK? ? ? ? ?RCC_APB1Periph_CAN1
#define CAN1_MODE? ? ? ? CAN_Mode_Normal? ? ? ? ?/* 工作模式 */
/* CAN1_TX的引腳 */
#define CAN1_TX_RCC? ? ?RCC_APB2Periph_GPIOD
#define CAN1_TX_PIN? ? ?GPIO_Pin_1
#define CAN1_TX_PORT? ? GPIOD
/* CAN1_RX的引腳 */
#define CAN1_RX_RCC? ? ?RCC_APB2Periph_GPIOD
#define CAN1_RX_PIN? ? ?GPIO_Pin_0
#define CAN1_RX_PORT? ? GPIOD
/* CAN1 STB的引腳 */
#define CAN1_STB_RCC? ? ?RCC_APB2Periph_GPIOD
#define CAN1_STB_PIN? ? ?GPIO_Pin_11
#define CAN1_STB_PORT? ? GPIOD
/* 接收中斷配置 */
#define CAN1_RX_IRQ_HANDLE? CAN1_RX1_IRQHandler
#define CAN1_RX_IRQ? ? ? ? ?CAN1_RX1_IRQn
#define CAN1_RX_IRQ_PRIO? ?10
/* CAN1 綁定FIFO的編號(hào) */
#define CAN1_FIFIO_NUM? ? ? CAN_Filter_FIFO0
/*
*********************************************************************************************************
*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?函數(shù)聲明
*********************************************************************************************************
*/
int bsp_can_set_status(CAN_PORT_ENUM can, CAN_STATUS_ENUM status);
/*
*********************************************************************************************************
*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?變量
*********************************************************************************************************
*/
/* can消息 */
CanRxMsg can_rx_msg[CAN_PORT_NUM];
const CAN_PIN_MNT can_pin_mnt[CAN_PORT_NUM] = {
? ? /* CAN0 */
? ? {
? ? ? ? {CAN1_RX_RCC, CAN1_RX_PIN, CAN1_RX_PORT},? ? ? ? ? ?/* rx */
? ? ? ? {CAN1_TX_RCC, CAN1_TX_PIN, CAN1_TX_PORT},? ? ? ? ? ?/* tx */
? ? ? ? {CAN1_STB_RCC, CAN1_STB_PIN, CAN1_STB_PORT}? ? ? ? /* stb */
? ? }
};
CAN_CFG_MNT_T can_cfg_mnt[CAN_PORT_NUM] = {
? ? /* CAN1 */
? ? ? ? {
? ? ? ? ? ? CAN1,? ? ? ? ? ? ? ? ? ?/* 端口 */
? ? ? ? ? ? CAN1_CLK,? ? ? ? ? ? ? ?/* 時(shí)鐘 */
? ? ? ? ? ? CAN_BAUDRATE_500K,? ? ? /* 波特率 */
? ? ? ? ? ? CAN1_RX_IRQ,? ? ? ? ? /* 中斷號(hào) */
? ? ? ? ? ? CAN1_RX_IRQ_PRIO,? ? ? ?/* 中斷優(yōu)先級(jí) */
? ? ? ? ? ? 0,? ? ? ? ? ? ? ? ? ? ? /* 接收中斷回調(diào) */
? ? ? ? ? ? CAN_WORK_STATUS,? ? ? ? /* 工作狀態(tài) */
? ? ? ? ? ? CAN1_MODE,? ? ? ? ? ? ? /* 工作模式 */
? ? ? ? ? ? 0,? ? ? ? ? ? ? ? ? ? ? /* 標(biāo)準(zhǔn)ID */
? ? ? ? }
};
/*
*********************************************************************************************************
*? ?函 數(shù) 名: bsp_can_init_port
*? ?功能說明: 配置can指示燈相關(guān)的GPIO
*? ?形? ? 參:? 無
*? ?返 回 值: 無
*********************************************************************************************************
*/
int bsp_can_init_port(const CAN_PIN_MNT *can)
{
? ? GPIO_InitTypeDef GPIO_InitSturcture={0};
? ? /* 時(shí)鐘初始化 */
? ? RCC_APB2PeriphClockCmd(can->rx.clk | RCC_APB2Periph_AFIO, ENABLE);
? ? RCC_APB2PeriphClockCmd(can->tx.clk | RCC_APB2Periph_AFIO, ENABLE);
? ? RCC_APB2PeriphClockCmd(can->stb.clk, ENABLE);
? ? /* 將CAN1重映射到 PD0和PD1引腳上 */
? ? GPIO_PinRemapConfig(GPIO_Remap2_CAN1, ENABLE);
? ? /* 初始化 tx pin */
? ? GPIO_InitSturcture.GPIO_Pin = can->tx.pin;
? ? GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;
? ? GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;
? ? GPIO_Init(can->tx.port, &GPIO_InitSturcture);
? ? /* 初始化 rx pin */
? ? GPIO_InitSturcture.GPIO_Pin = can->rx.pin;
? ? GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_IPU;
? ? GPIO_Init(can->rx.port, &GPIO_InitSturcture);
? ? /* 初始化 STB pin */
? ? GPIO_InitSturcture.GPIO_Pin = can->stb.pin;
? ? GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_Out_PP;
? ? GPIO_Init(can->stb.port, &GPIO_InitSturcture);
? ? return 0;
}
/*
*********************************************************************************************************
*? ?函 數(shù) 名: bsp_can_init_cfg
*? ?功能說明: 配置CAN總線相關(guān)參數(shù)
*? ?形? ? 參:? can can配置結(jié)構(gòu)體
*? ?返 回 值: 0 成功
*********************************************************************************************************
*/
int bsp_can_init_cfg(CAN_CFG_MNT_T *can, CAN_PORT_ENUM port)
{
? ? int result = 0;
? ? CAN_InitTypeDef CAN_InitSturcture = {0};
? ? CAN_FilterInitTypeDef CAN_FilterInitSturcture = {0};
? ? NVIC_InitTypeDef? NVIC_InitStructure = {0};
? ? /* 初始化CAN時(shí)鐘 */
? ? RCC_APB1PeriphClockCmd(can->can_clk, ENABLE);
? ? /* initialize CAN parameters */
? ? CAN_InitSturcture.CAN_TTCM = DISABLE;? ? ? ? ? ? ? ?/* 禁止時(shí)間觸發(fā)模式(不生成時(shí)間戳), T? */
? ? CAN_InitSturcture.CAN_ABOM = DISABLE;? ? ? ? ? ? ? ?/* 禁止自動(dòng)總線關(guān)閉管理 */
? ? CAN_InitSturcture.CAN_AWUM = DISABLE;? ? ? ? ? ? ? ?/* 禁止自動(dòng)喚醒模式 */
? ? CAN_InitSturcture.CAN_NART = ENABLE;? ? ? ? ? ? ? ? /* 使能仲裁丟失或出錯(cuò)后的自動(dòng)重傳功能 */
? ? CAN_InitSturcture.CAN_RFLM = DISABLE;? ? ? ? ? ? ? ?/* 禁止接收FIFO */
? ? CAN_InitSturcture.CAN_TXFP = DISABLE;? ? ? ? ? ? ? ?/* 禁止傳輸FIFO優(yōu)先級(jí) */
? ? CAN_InitSturcture.CAN_Mode = can->mode;? ? ? ?/* 設(shè)置CAN為正常工作模式 */
? ? /*
? ? ? ? CAN 波特率 = apb1 / Prescaler / (SJW + BS1 + BS2);
? ? ? ? SJW = synchronisation_jump_width
? ? ? ? BS = bit_segment
? ? ? ? 本例中,設(shè)置CAN波特率為1000Kbps
? ? ? ? CAN 波特率 = 72000000 / 6 / (1 + 5 + 6) / = 1000kHz
? ? */
? ? CAN_InitSturcture.CAN_SJW = CAN_SJW_1tq;
? ? CAN_InitSturcture.CAN_BS1 = CAN_BS1_6tq;
? ? CAN_InitSturcture.CAN_BS2 = CAN_BS2_5tq;
? ? switch(can->baudrate){
? ? case CAN_BAUDRATE_1M:
? ? ? ? CAN_InitSturcture.CAN_Prescaler = 6;
? ? break;
? ? case CAN_BAUDRATE_500K:
? ? ? ? CAN_InitSturcture.CAN_Prescaler = 12;
? ? break;
? ? case CAN_BAUDRATE_250K:
? ? ? ? CAN_InitSturcture.CAN_Prescaler = 24;
? ? break;
? ? case CAN_BAUDRATE_125K:
? ? ? ? CAN_InitSturcture.CAN_Prescaler = 48;
? ? break;
? ? case CAN_BAUDRATE_100K:
? ? ? ? CAN_InitSturcture.CAN_Prescaler = 60;
? ? break;
? ? case CAN_BAUDRATE_50K:
? ? ? ? CAN_InitSturcture.CAN_Prescaler = 120;
? ? break;
? ? default:
? ? ? ? /* 默認(rèn)500k */
? ? ? ? CAN_InitSturcture.CAN_Prescaler = 12;
? ? ? ? result = -1;
? ? break;
? ? }
? ? /* initialize CAN */
? ? if(CAN_Init(CAN1, &CAN_InitSturcture) == ERROR) {
? ? ? ? result = -1;
? ? }
? ? /* initialize filter */
? ? CAN_FilterInitSturcture.CAN_FilterNumber = 0;? ? ? ? ? ? ? ? ? ? ? /* 濾波器序號(hào),0-13,共14個(gè)濾波器 */
? ? CAN_FilterInitSturcture.CAN_FilterMode = CAN_FilterMode_IdList;? ? /* 濾波器模式,設(shè)置ID掩碼模式 */
? ? CAN_FilterInitSturcture.CAN_FilterScale = CAN_FilterScale_32bit;? ?/* 32位濾波 */
? ? CAN_FilterInitSturcture.CAN_FilterIdHigh = 0x0000;? ? ? ? ? ? ? ? ?/* 掩碼后ID的高16bit */
? ? CAN_FilterInitSturcture.CAN_FilterIdLow = 0x0000;? ? ? ? ? ? ? ? ? /* 掩碼后ID的低16bit */
? ? CAN_FilterInitSturcture.CAN_FilterMaskIdHigh = 0x0000;? ? ? ? ? ? ?/* ID掩碼值高16bit */
? ? CAN_FilterInitSturcture.CAN_FilterMaskIdLow = 0x0006;? ? ? ? ? ? ? /* ID掩碼值低16bit */
? ? CAN_FilterInitSturcture.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;? ? ? /* 濾波器綁定FIFO 0 */
? ? CAN_FilterInitSturcture.CAN_FilterScale = ENABLE;? ? ? ? ? ? ? ? ? /* 使能濾波器 */
? ? CAN_FilterInit(&CAN_FilterInitSturcture);
? ? /* 配置工作模式 */
? ? bsp_can_set_status(port, can->status);
? ? return result;
}
/*
*********************************************************************************************************
*? ?函 數(shù) 名: bsp_init_can
*? ?功能說明: 配置can
*? ?形? ? 參:? 無
*? ?返 回 值: 無
*********************************************************************************************************
*/
int bsp_init_can(
? ? CAN_PORT_ENUM can,
? ? int (*rx_msg_irq_callback)(CanRxMsg *msg))
{
? ? int result = -1;
? ? if(can < CAN_PORT_NUM) {
? ? ? ? /* IO初始化 */
? ? ? ? bsp_can_init_port(&can_pin_mnt[can]);
? ? ? ? /* CAN初始化 */
? ? ? ? bsp_can_init_cfg(&can_cfg_mnt[can], can);
? ? ? ? /* 設(shè)置回到函數(shù) */
? ? ? ? can_cfg_mnt[can].rx_irq_callback = rx_msg_irq_callback;
? ? ? ? result = 0;
? ? }
? ? return result;
}
/*
*********************************************************************************************************
*? ?函 數(shù) 名: bsp_can_set_status
*? ?功能說明: 設(shè)置CAN狀態(tài)
*? ?形? ? 參: port 端口
*? ? ? ? ? ? ? ?status 狀態(tài)
*? ?返 回 值: 0 成功
*********************************************************************************************************
*/
int bsp_can_set_status(CAN_PORT_ENUM can, CAN_STATUS_ENUM status)
{
? ? int result = -1;
? ? if(can < CAN_PORT_NUM) {
? ? ? ? if(status == CAN_STANDBY_STATUS) {
? ? ? ? ? ? can_pin_mnt[can].stb.port->BSHR = can_pin_mnt[can].stb.pin;
? ? ? ? } else {
? ? ? ? ? ? can_pin_mnt[can].stb.port->BCR = can_pin_mnt[can].stb.pin;
? ? ? ? }
? ? ? ? result = 0;
? ? }
? ? return result;
}
/*
*********************************************************************************************************
*? ?函 數(shù) 名: bsp_can_tx_msg
*? ?功能說明: 發(fā)送數(shù)據(jù)
*? ?形? ? 參:? ?msg? 發(fā)送數(shù)據(jù)緩沖區(qū)
*? ? ? ? ? ? ? ?port CAN端口值
*? ?返 回 值:? ?0 發(fā)送成功
*? ? ? ? ? ? ? -1 發(fā)送失敗
*********************************************************************************************************
*/
int bsp_can_tx_msg(CAN_PORT_ENUM port, CanTxMsg *msg)
{
? ? uint8_t mbox;
? ? uint16_t i = 0;
? ? int result = -1;
? ? if(port < CAN_PORT_NUM) {
? ? ? ? mbox = CAN_Transmit(can_cfg_mnt[port].com, msg);
? ? ? ? i = 0;
? ? ? ? while((CAN_TransmitStatus(can_cfg_mnt[port].com, mbox) != CAN_TxStatus_Ok) && (i < 0xFFF)){
? ? ? ? ? ? i++;
? ? ? ? }
? ? ? ? if( i != 0xFFF ){
? ? ? ? ? ? result = 0;
? ? ? ? }
? ? }
? ? return result;
}
/*
*********************************************************************************************************
*? ?函 數(shù) 名: bsp_can_receive_msg
*? ?功能說明: 接收數(shù)據(jù)
*? ?形? ? 參:? ?buf? 接收區(qū)數(shù)據(jù)緩沖區(qū)
*? ? ? ? ? ? ? ?port CAN端口值
*? ?返 回 值:? ?接收數(shù)據(jù)長(zhǎng)度
*********************************************************************************************************
*/
uint8_t bsp_can_receive_msg( uint8_t *buf, CAN_PORT_ENUM port)
{
? ? uint8_t result = 0;
? ? CanRxMsg CanRxStructure;
? ? if( CAN_MessagePending(can_cfg_mnt[port].com, CAN_FIFO0) != 0){
? ? ? ? CAN_Receive(can_cfg_mnt[port].com, CAN_FIFO0, &CanRxStructure );
? ? ? ? memcpy(buf, CanRxStructure.Data, CanRxStructure.DLC);
? ? ? ? result = CanRxStructure.DLC;
? ? }
? ? return result;
}
/*
*********************************************************************************************************
*? ?函 數(shù) 名: bsp_can_get_cfg_info
*? ?功能說明: 獲取can配置結(jié)構(gòu)體
*? ?形? ? 參: can 端口
*? ?返 回 值: 0 成功
*********************************************************************************************************
*/
CAN_CFG_MNT_T *bsp_can_get_cfg_info(CAN_PORT_ENUM port)
{
? ? return &can_cfg_mnt[port];
}
/*******************************************************************************************************/