CH32V307 CAN1收發(fā)數(shù)據(jù)問題

我使用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ù)也是成功了的image.png

以下是我的初始化代碼

/*

*********************************************************************************************************

*? ?模塊名稱 : 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];

}




/*******************************************************************************************************/


您好,若程序中有用到中斷接收,注意中斷函數(shù)需要加中斷聲明。此外,在我們EVT中有CAN正常模式收發(fā)的例程,可以參考一下。后續(xù)若有問題,可通過郵箱(lzs@wch.cn)和我溝通,若方便可將工程發(fā)至我的郵箱,這邊具體看一下


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频