发新帖我要提问
123
返回列表
打印
[STM32F1]

STM32 基础篇——CAN

[复制链接]
楼主: aizaixiyuanqian
手机看帖
扫描二维码
随时随地手机跟帖
41
aizaixiyuanqian|  楼主 | 2018-3-15 12:10 | 只看该作者 回帖奖励 |倒序浏览
CAN_FilterMaskIdLow:这个是屏蔽寄存器高字节的设置,这个跟上
面的高字节设置是一样的。

使用特权

评论回复
42
aizaixiyuanqian|  楼主 | 2018-3-15 12:10 | 只看该作者
CAN_FilterFIFOAssignment:选择你要使用的邮箱,它有 0 和 1。我
们这里使用 0,所以设置为:CAN_Filter_FIFO0。

使用特权

评论回复
43
aizaixiyuanqian|  楼主 | 2018-3-15 12:12 | 只看该作者
CAN_FilterActivation:表示过滤器的使能。我们选择开启,设置为:
ENABLE。

使用特权

评论回复
44
aizaixiyuanqian|  楼主 | 2018-3-15 12:12 | 只看该作者
接收的话,如果要使用中断接收,我们要设置中断,也就是 NVIC,设
置方式我们应该很熟悉了,我们这里就不详细将了。代码如下:
NVIC_InitTypeDef NVIC_InitStructure;
/* 使能接收的中断和中断优先级 */
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); //FIFO0 消息挂号中断
允许.

使用特权

评论回复
45
aizaixiyuanqian|  楼主 | 2018-3-15 12:15 | 只看该作者
初始化 CAN相关的GPIO
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
/* 初始化 IO 口 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PA12
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PA11
GPIO_Init(GPIOA, &GPIO_InitStructure);

使用特权

评论回复
46
aizaixiyuanqian|  楼主 | 2018-3-15 12:16 | 只看该作者
CAN 设置和初始化
/* 打开时钟使能 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
/* 初始化 CAN 的参数 */
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
/* CAN 参数初始化 */
CAN_InitStructure.CAN_TTCM = DISABLE; //失能时间触发模式
CAN_InitStructure.CAN_ABOM = DISABLE; //失能自动离线管理
CAN_InitStructure.CAN_AWUM = DISABLE; //失能睡眠模式通过软
件唤醒
CAN_InitStructure.CAN_NART = DISABLE; //失能非自动重传输模
式(也就是会自动重传输)
CAN_InitStructure.CAN_RFLM = DISABLE; //失能接收 FIFO 锁定模
式,新数据会覆盖旧数据
CAN_InitStructure.CAN_TXFP = DISABLE; //优先级由报文标识符决

CAN_InitStructure.CAN_Mode = mode; //有普通模式和拓展模式
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //重新同步跳跃宽度 1
个时间单位
/* 波特率设置, 当 APB1 的时钟频率是 36MHZ 的时候。 波特率的公式
为: */
/* 波 特 率 (Kpbs) = 36M / ((CAN_BS1 + CAN_BS2 + 1) *
CAN_Prescaler) */
CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq; //时间段 1 为 8 个时间
单位
CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq; //时间段 2 为 7 个时间
单位
CAN_InitStructure.CAN_Prescaler = 5;
CAN_Init(CAN1, &CAN_InitStructure);

使用特权

评论回复
47
aizaixiyuanqian|  楼主 | 2018-3-15 12:17 | 只看该作者
CAN 设置 16 位 ID 函数
CAN_FilterInitTypeDef CAN_FilterInitStructure;
uint16_t mask = 0xFFFF;
/* CAN filter init 屏蔽寄存器初始化 */
CAN_FilterInitStructure.CAN_FilterNumber = 1; //过滤
器 1
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;//ID
模式
/* 寄存器组设置为 16 位 */
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = (id1 << 5); //要接收的ID
标示符 1
CAN_FilterInitStructure.CAN_FilterIdLow = (id2 << 5); // 要 接 收 的
ID 标示符 2
/* 设置为所有 ID 位都要相同才接收 */
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (mask << 5); //MASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow = (mask << 5);
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
//FIFO0
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //使能过滤器 1
CAN_FilterInit(&CAN_FilterInitStructure);

使用特权

评论回复
48
aizaixiyuanqian|  楼主 | 2018-3-15 12:18 | 只看该作者
CAN 发送函数
void CAN1_SendMesg(uint32_t id, uint8_t len, uint8_t *dat)
{
uint16_t i = 0;
CanTxMsg TxMessage;
/* 一次发送只能发送 8 个字节 */
if(len > 8)
{
return ;
}
/* 配置邮箱:设置标识符,数据长度和待发送数据 */
TxMessage.StdId = (id & 0x7FF); //标准帧 ID11 位
TxMessage.ExtId = (id >> 11); //设置扩展标示符(拓展标示符有 29 位)
TxMessage.RTR = CAN_RTR_DATA; //设置为数据帧(或远程帧为
CAN_RTR_Remote)
if((id & 0x7FF) == 0x7FF) //检测是标准帧还是拓展帧(拓展帧大
于 11 位)
{
TxMessage.IDE = CAN_ID_STD; //拓展 ID
}
else
{
TxMessage.IDE = CAN_ID_EXT; //标准 ID
}
TxMessage.DLC = len;  //发送的数据长度
/* 将数据放入到邮箱中 */
for(i=0; i<len; i++)
{
TxMessage.Data[i] = *dat;
dat++;
}
/* 开始传送数据 */
CAN_Transmit(CAN1, &TxMessage);
}

使用特权

评论回复
49
aizaixiyuanqian|  楼主 | 2018-3-15 12:18 | 只看该作者
CAN 接收函数
void CAN1_ReceiveMesg(uint8_t *receiveBuff)
{
uint8_t i = 0;
CanRxMsg RxMessage; //设置接收邮箱
if((CAN_MessagePending(CAN1, CAN_FIFO0) != 0)) //检查FIFO0里面是
否有数据
{
CAN_Receive(CAN1,CAN_FIFO0,&RxMessage); //读取FIFO0里面的
数据
for(i=0; i<RxMessage.DLC; i++) //将读取到的数据位赋给
CAN_RXSBUF
{
*receiveBuff = RxMessage.Data[i];
receiveBuff++;
}
}
}

使用特权

评论回复
50
aizaixiyuanqian|  楼主 | 2018-3-15 12:19 | 只看该作者
主函数相关初始化
/* 初始化 */
TFT_Init();
FLASH_Init();
SYSTICK_Config();
USART1_Config(9600);
LED_Config();
KEY_Config();
/* 彩屏显示初始化 */
GUI_DisplayInit();
m = 10;
canMode = 1; //要设置 canMode 不等于 CAN_SendData[10],以便进入循环
一开始就初始化

使用特权

评论回复
51
aizaixiyuanqian|  楼主 | 2018-3-15 12:20 | 只看该作者
if(canMode != CAN_SendData[10] )
{
canMode = CAN_SendData[10];
if(CAN_SendData[10])
{
CAN1_Config(CAN_Mode_Normal);
Mode = (uint8_t *)CAN_ModeNormal;
}
else
{
CAN1_Config(CAN_Mode_LoopBack);
Mode = (uint8_t *)CAN_ModeLoopBack;
}
CAN1_Config16BitFilter(CAN_SendData[9], 0x00);
}
/* 如果接收 ID 改变,就重新设置接收 ID */
if(receiveId != CAN_SendData[9])
{
receiveId = CAN_SendData[9];
if(receiveId != 0x00)
{
CAN1_Config16BitFilter(CAN_SendData[9], 0x00);
}
}

使用特权

评论回复
52
aizaixiyuanqian|  楼主 | 2018-3-15 12:20 | 只看该作者
/* 显示数据 */
GUI_DisplayData(m);
/* LED 灯闪烁 */
i++;
if(i > 0x5F)
{
i = 0;
if(ledState == 0xFE)
{
ledState = 0xFF;
}
else
{
ledState = 0xFE;
}
LED_SetState(ledState);
}

使用特权

评论回复
53
aizaixiyuanqian|  楼主 | 2018-3-15 12:20 | 只看该作者
/* 根据键盘,做出相应的操作 */
switch(KEY_Scan())
{
case(KEY_UP):
if(m == 10)
{
CAN_SendData[10] = ~CAN_SendData[10];
}
else
{
CAN_SendData[m]++;
}
GUI_Show12Char(175, 84, "等待发送", RED, BLACK);
break;
case(KEY_DOWN):
if(m == 10)
{
CAN_SendData[10] = ~CAN_SendData[10];
}
else
{
CAN_SendData[m]--;
}
GUI_Show12Char(175, 84, "等待发送", RED, BLACK);
break;
case(KEY_LEFT):
if(m == 10)
{
m = 0;
}
else
{
m++;
}
break;
case(KEY_RIGHT):
CAN1_SendMesg(CAN_SendData[8], 8, CAN_SendData);//
发送数据
GUI_Show12Char(175, 84, "发送成功", BLUE, BLACK);
break;
default:
break;
}
}

使用特权

评论回复
54
aizaixiyuanqian|  楼主 | 2018-3-15 12:21 | 只看该作者
本次对于CAN总线的操作就到这里,感谢大家支持。

使用特权

评论回复
55
一路向北lm| | 2018-3-15 12:23 | 只看该作者
感谢分享资料很详细啊

使用特权

评论回复
评论
aizaixiyuanqian 2018-3-17 17:40 回复TA
感谢支持,继续努力 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则