你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
CAN 通信
[复制链接]
cpev
提问时间:2018-4-26 17:02 /
单片机型号为STM32F103VC,发个CAN通信的例程参考对比下。接收需要是中断接收。
赞
0
收藏
0
评论
4
分享
发布时间:2018-4-26 17:02
举报
请先
登录
后回复
4个回答
jonecolu
回答时间:2018-4-26 17:27:09
a0a.1 32b0c
库有说明使用
评分
参与人数
1
蝴蝶豆
+2
收起
理由
zero99
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
hungchieh1029
回答时间:2018-4-27 13:09:40
a0a.1 32b0c
/* CAN1 init function */
void CAN1_Init(CAN_HandleTypeDef *hcan, unsigned int BuadRate, FIFO_T *pCANxFIFO)
{
CAN_FilterConfTypeDef sFilterConfig;
/*--- Initialize FIFO--------------*/
pCAN1RxFIFO = pCANxFIFO; //pCAN1FIFO : 只在"CANBUS.c"可用 , 已備分pCANxFIFO的位置
pCAN1RxFIFO->head = 0;
pCAN1RxFIFO->tail = 0;
pCAN1RxFIFO->limit = CanRawDataLimit;
pCAN1RxFIFO->fifo = (char*)st_Can1RxRawData;
pCAN1RxFIFO->empty = 1;
pCAN1RxFIFO->full = 0;
pCAN1RxFIFO->datatype = sizeof(CAN_RAW_T);
hcan->Instance = CAN1;
hcan->pTxMsg = &CAN1TxMessage;
hcan->pRxMsg = &CAN1RxMessage;
hcan->Init.Prescaler = CANxBuadRate[BuadRate].Prescaler;
hcan->Init.Mode = CAN_MODE_NORMAL;
hcan->Init.SJW = CANxBuadRate[BuadRate].CAN_SJW_xTQ;
hcan->Init.BS1 = CANxBuadRate[BuadRate].CAN_BS1_xTQ;
hcan->Init.BS2 = CANxBuadRate[BuadRate].CAN_BS2_xTQ;
// MCR-TTCM 關閉時間觸發通信模式使能
hcan->Init.TTCM = DISABLE;
// MCR-ABOM 自動離線管理 : 發生BUS OFF時,只要MCR-ABOM = 1,就會自動恢復
hcan->Init.ABOM = ENABLE;
// MCR-AWUM 使用自動喚醒模式
hcan->Init.AWUM = DISABLE;
// MCR-NART 禁止報文自動重傳 : DISABLE-自動重傳
hcan->Init.NART = DISABLE;
// MCR-RFLM 接收FIFO 鎖定模式 DISABLE-溢出時新報文會覆蓋原有報文
hcan->Init.RFLM = DISABLE;
// MCR-TXFP 發送FIFO優先級 DISABLE-優先級取決於報文標示符
hcan->Init.TXFP = DISABLE;
if (HAL_CAN_Init(hcan) != HAL_OK)
{
while(1);
}
/*CAN過濾器初始化*/
sFilterConfig.FilterNumber = 0; //過濾器組0
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; //工作在標識符屏蔽位模式
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //過濾器位寬為單個32位。
/* 使能報文標示符過濾器按照標示符的內容進行比對過濾,擴展ID不是如下的就拋棄掉,是的話,會存入FIFO0。 */
sFilterConfig.FilterIdHigh = 0x0000; //要過濾的ID高位
sFilterConfig.FilterIdLow = 0x0000; //要過濾的ID低位
sFilterConfig.FilterMaskIdHigh = 0x0000; //過濾器高16位每位必須匹配
sFilterConfig.FilterMaskIdLow = 0x0000; //過濾器低16位每位必須匹配
sFilterConfig.FilterFIFOAssignment = CAN_FIFO0; //過濾器被關聯到FIFO 0
sFilterConfig.FilterActivation = ENABLE; //使能過濾器
sFilterConfig.BankNumber = 14;
HAL_CAN_ConfigFilter(hcan, &sFilterConfig);
HAL_CAN_Receive_IT(hcan, CAN_FIFO0);
}
void CAN1_Receive_ISR(CAN_HandleTypeDef *hcan)
{
CAN_RAW_T st_CAN;
/*---- CAN_MSG_Type(st_Message) copy to CAN_RAW_T(st_CAN)*/
st_CAN.ID.COBID = (hcan->pRxMsg->IDE == CAN_ID_STD) ? hcan->pRxMsg->StdId : hcan->pRxMsg->ExtId;
st_CAN.Frame.len = hcan->pRxMsg->DLC;
st_CAN.Frame.identifier = (hcan->pRxMsg->IDE == CAN_ID_STD) ? 0 : 1;
st_CAN.Frame.format = (hcan->pRxMsg->RTR == CAN_RTR_DATA) ? 0 : 1;
memcpy((char*)&st_CAN.Data.u8_RAW[0], (char*)&hcan->pRxMsg->Data[0], st_CAN.Frame.len);
//將整理過後的st_CAN,塞進pCAN1FIFO
FIFO_put(pCAN1RxFIFO,&st_CAN);
}
评分
参与人数
1
蝴蝶豆
+3
收起
理由
zero99
+ 3
查看全部评分
赞
0
评论
回复
支持
反对
废鱼
回答时间:2018-4-27 15:37:43
a0a.1 32b0c
楼主应该主动一些,在HAL和标准库下都有例程的。我上传一个标准库的例程:
CAN.zip
(45.19 KB, 下载次数: 8)
2018-4-27 15:37 上传
点击文件名下载附件
评分
参与人数
1
蝴蝶豆
+3
收起
理由
zero99
+ 3
查看全部评分
赞
0
评论
回复
支持
反对
define
回答时间:2018-4-27 15:56:21
a0a.1 32b0c
不错的资料继续加油
评分
参与人数
1
蝴蝶豆
-5
收起
理由
zero99
-5
求助帖灌水,警告一下
查看全部评分
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
评分
查看全部评分
void CAN1_Init(CAN_HandleTypeDef *hcan, unsigned int BuadRate, FIFO_T *pCANxFIFO)
{
CAN_FilterConfTypeDef sFilterConfig;
/*--- Initialize FIFO--------------*/
pCAN1RxFIFO = pCANxFIFO; //pCAN1FIFO : 只在"CANBUS.c"可用 , 已備分pCANxFIFO的位置
pCAN1RxFIFO->head = 0;
pCAN1RxFIFO->tail = 0;
pCAN1RxFIFO->limit = CanRawDataLimit;
pCAN1RxFIFO->fifo = (char*)st_Can1RxRawData;
pCAN1RxFIFO->empty = 1;
pCAN1RxFIFO->full = 0;
pCAN1RxFIFO->datatype = sizeof(CAN_RAW_T);
hcan->Instance = CAN1;
hcan->pTxMsg = &CAN1TxMessage;
hcan->pRxMsg = &CAN1RxMessage;
hcan->Init.Prescaler = CANxBuadRate[BuadRate].Prescaler;
hcan->Init.Mode = CAN_MODE_NORMAL;
hcan->Init.SJW = CANxBuadRate[BuadRate].CAN_SJW_xTQ;
hcan->Init.BS1 = CANxBuadRate[BuadRate].CAN_BS1_xTQ;
hcan->Init.BS2 = CANxBuadRate[BuadRate].CAN_BS2_xTQ;
// MCR-TTCM 關閉時間觸發通信模式使能
hcan->Init.TTCM = DISABLE;
// MCR-ABOM 自動離線管理 : 發生BUS OFF時,只要MCR-ABOM = 1,就會自動恢復
hcan->Init.ABOM = ENABLE;
// MCR-AWUM 使用自動喚醒模式
hcan->Init.AWUM = DISABLE;
// MCR-NART 禁止報文自動重傳 : DISABLE-自動重傳
hcan->Init.NART = DISABLE;
// MCR-RFLM 接收FIFO 鎖定模式 DISABLE-溢出時新報文會覆蓋原有報文
hcan->Init.RFLM = DISABLE;
// MCR-TXFP 發送FIFO優先級 DISABLE-優先級取決於報文標示符
hcan->Init.TXFP = DISABLE;
if (HAL_CAN_Init(hcan) != HAL_OK)
{
while(1);
}
/*CAN過濾器初始化*/
sFilterConfig.FilterNumber = 0; //過濾器組0
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; //工作在標識符屏蔽位模式
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //過濾器位寬為單個32位。
/* 使能報文標示符過濾器按照標示符的內容進行比對過濾,擴展ID不是如下的就拋棄掉,是的話,會存入FIFO0。 */
sFilterConfig.FilterIdHigh = 0x0000; //要過濾的ID高位
sFilterConfig.FilterIdLow = 0x0000; //要過濾的ID低位
sFilterConfig.FilterMaskIdHigh = 0x0000; //過濾器高16位每位必須匹配
sFilterConfig.FilterMaskIdLow = 0x0000; //過濾器低16位每位必須匹配
sFilterConfig.FilterFIFOAssignment = CAN_FIFO0; //過濾器被關聯到FIFO 0
sFilterConfig.FilterActivation = ENABLE; //使能過濾器
sFilterConfig.BankNumber = 14;
HAL_CAN_ConfigFilter(hcan, &sFilterConfig);
HAL_CAN_Receive_IT(hcan, CAN_FIFO0);
}
void CAN1_Receive_ISR(CAN_HandleTypeDef *hcan)
{
CAN_RAW_T st_CAN;
/*---- CAN_MSG_Type(st_Message) copy to CAN_RAW_T(st_CAN)*/
st_CAN.ID.COBID = (hcan->pRxMsg->IDE == CAN_ID_STD) ? hcan->pRxMsg->StdId : hcan->pRxMsg->ExtId;
st_CAN.Frame.len = hcan->pRxMsg->DLC;
st_CAN.Frame.identifier = (hcan->pRxMsg->IDE == CAN_ID_STD) ? 0 : 1;
st_CAN.Frame.format = (hcan->pRxMsg->RTR == CAN_RTR_DATA) ? 0 : 1;
memcpy((char*)&st_CAN.Data.u8_RAW[0], (char*)&hcan->pRxMsg->Data[0], st_CAN.Frame.len);
//將整理過後的st_CAN,塞進pCAN1FIFO
FIFO_put(pCAN1RxFIFO,&st_CAN);
}
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分