通信协议
基本知识
特别注意 CAN2配置时,滤波器要从[14]开始配置。
代码块
#define CAN2_PORT CAN2
#define CAN2_GPIO_PORT GPIOB
#define CAN2_RX_PIN GPIO_Pin_12
#define CAN2_TX_PIN GPIO_Pin_13
#define CAN_ID_Chassis 130
struct CAN_Socket
{
unsigned int u32_StdId;
unsigned int u32_ExtId;
unsigned char u8_IDE;
unsigned char u8_RTR;
unsigned char u8_DLC;
unsigned char u8_FMI;
unsigned char u8_data[8];
};
typedef struct CAN_Socket CAN;
CAN Send_Socket;
CanRxMsg RxMessage2;
CanTxMsg TxMessage2;
void CAN_Data_Init(void)
{
int i;
Send_Socket.u32_StdId = CAN_ID_Chassis;
Send_Socket.u8_IDE = CAN_ID_STD;
Send_Socket.u8_RTR = CAN_RTR_DATA;
Send_Socket.u8_DLC = DLC_MAX;
for(i = 0; i<8; i++)
{
Send_Socket.u8_data[i] = 0;
}
}
void CAN2_Setup()
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
GPIO_InitStructure.GPIO_Pin = CAN2_RX_PIN|CAN2_TX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
//GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(CAN2_GPIO_PORT, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_CAN2); //CAN_RX = PB12
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_CAN2); //CAN_TX = PB13
CAN_DeInit(CAN2);
CAN_StructInit(&CAN_InitStructure);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = ENABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;//同步跳转时间段
CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;//时间段1
CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;//时间段2
CAN_InitStructure.CAN_Prescaler = 6;//波特率分频器
/* CAN 波特率配置 = 42MHz/[(1+3+3)*6] = 1MHz (APB1的时钟频率一般为42MHz)*/
if(CAN_Init(CAN2, &CAN_InitStructure) == CANINITFAILED)
{
do {}
while(1);
}
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber = 14;//CAN2的滤波器从14开始
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
// CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void CAN2_RX0_IRQHandler(void)
{
int i;
RxMessage2.StdId = 0x00;
RxMessage2.ExtId = 0x00;
for(i =0; i<8; i++)
{
RxMessage2.Data[i] = 0;
}
CAN_Receive(CAN2, CAN_FIFO0, &RxMessage2);
switch(RxMessage2.StdId)
{
case 1:
break;
case 2:
break;
default:
break;
}
}
void CAN_TxSocket_CAN2(CAN *can_Socket)
{
char i = 0;
TxMessage2.StdId=can_Socket->u32_StdId;
TxMessage2.ExtId=can_Socket->u32_ExtId;
TxMessage2.IDE=can_Socket->u8_IDE;
TxMessage2.RTR= can_Socket->u8_RTR;
TxMessage2.DLC=can_Socket->u8_DLC;
for(i =0; i TxMessage2.Data[i] = can_Socket->u8_data[i]; } i = CAN_Transmit(CAN2, &TxMessage2); } int main(void) { CAN2_Setup(); CAN_Data_Init(); while(1) { if(Send_Flag == 1)//这个flag可用一个定时器来计时,这里不做特别说明 { Send_Flag = 0; CAN_TxSocket_CAN2(&Send_Socket);//Send_Socket中可以存入要发送的数据 } } }
上一篇:利用CAN中断进行简单的数据接收
下一篇:STM32F4 CubeMX HAL CAN 使用步骤
推荐阅读
史海拾趣
Digi International与UR集团达成了战略协议,共同关注铁路、公共汽车和智慧城市等领域的发展。这一合作不仅为公司带来了新的市场机会,也促进了其在智能交通系统领域的业务拓展。通过与UR集团的紧密合作,Digi International的智能铁路解决方案在英国市场上得到了广泛应用,提高了铁路运输的效率和安全性。
在电子行业的初期,EBK Kruger GmbH & Co KG由创始人Klaus Kruger在德国的一个小镇创立。Klaus是一位电子工程师,对新型电子元器件的研发充满热情。他带领团队成功研发出一种具有更高稳定性和更低能耗的新型电阻器,这一技术突破让公司在行业中崭露头角。通过不断的技术创新和产品优化,EBK Kruger逐渐赢得了市场的认可。
在国内市场取得一定成绩后,Brite-Led开始将目光投向海外市场。公司制定了一系列市场拓展策略,包括参加国际展会、建立海外销售网络、与当地企业合作等。经过几年的努力,Brite-Led的产品逐渐打入国际市场,赢得了众多海外客户的青睐。同时,公司也在全球范围内建立了多个研发中心和生产基地,以更好地服务全球客户。
“Global Memory Tech”公司在HMC技术的研发过程中,深刻认识到国际合作的重要性。该公司积极与全球各地的科研机构、高校和行业标准组织合作,共同推动HMC技术的标准化进程。通过不懈努力,Global Memory Tech成功推动了HMC相关标准的制定,为HMC技术的广泛应用奠定了坚实基础。同时,该公司还通过技术授权和合作生产的方式,与多家国际企业建立了紧密的合作关系。
随着全球对环保和可持续发展的重视,东通电子也积极响应号召,推行环保生产。公司在2005年开始推行环保电容生产,并在2007年通过了ISO14001:2004环境管理体系认证。这一举措不仅提升了公司的环保水平,也为客户提供了更加环保、可靠的产品。
基于SRAM的可重配置PLD(可编程逻辑器件)的出现,为系统设计者动态改变运行电路中PLD的逻辑功能创造了条件。PLD使用SRAM单元来保存字的配置数据决定了PLD内部互连和功能,改变这些数据,也就改变了器件的逻辑功能。由于SRAM的数据是易失的,因此这 ...… 查看全部问答∨ |
|
德州仪器高性能模拟器件在大学生电子设计中的应用与快速选型指南 本帖最后由 paulhyde 于 2014-9-15 04:00 编辑 德州仪器高性能模拟器件在大学生电子设计中的应用与快速选型指南 两部分需要一起下载才能解压 [ 本帖最后由 open82977352 于 2009-7-27 18:07 编辑 ] … 查看全部问答∨ |
|
小弟看了很多人用IAR生成可执行.bin格式的文件,为什么我用他们的方法我生成的.bin文件居然有700M,很是郁闷,不知道是怎么一回事啊。在Category理得output converter里面我选择输出格式是binary。按理说也就2M左右吧,居然这么大,大家有遇到这种问 ...… 查看全部问答∨ |
|
我用的是市场买的2440开发板,配夏普LQ121S1LG45液晶自己开发驱动。 夏普LQ121S1LG45的pdf资料网上找不到,我只找到了LQ121S1LG41和LQ121S1LG61的,它们参数都一样,目前我计算的是下面的一组参数,可以很清晰的显示静态开机画面了,但显示画面几 ...… 查看全部问答∨ |
在DDK中我学winio源码一样创建一个dll来动态加载键盘过滤驱动kbfiltr.sys,可是总是在StartService时出错,错误号为ERROR_SERVICE_DISABLED,可换成winio.sys就行了。我似乎看到过键盘驱动好像是不能动态加载的,可又不确定。 所以总结一下,我想 ...… 查看全部问答∨ |
在WINCE开发时,要连接到SQLSERVER的数据库执行一个查询,采用的SqlServerConnection,发现速度比较慢,从1万条数据里取30条数据需要2秒左右,而同样的程序如果在WINDOWS上执行,大楷10毫秒。 两者区别,一个在WINCE平台,利用USB和XP连接, ...… 查看全部问答∨ |
假设额定功率100KW,三相380V * 1.414 大约按500V计算,2个IGBT组成半桥,单IGBT占空比0.4,则计算出实际电流大约为:100K/500/0.4/2=250A,一般加倍选则,所以应该选500A/1200V的IGBT模块 因为IGBT导通时会有浪涌电流,有时候会很大甚至超过管子的 ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 【在线研讨会】ADI RadioVerse™技术与集成DPD算法的RF收发器AD9375
- 逛东芝电子在线展会,上百份礼品等您拿!
- 用富士通Cortex-M3 Easy Kit开发板,DIY出你的精彩!l
- EEworld独家原创视频:大话TI CC2650,邀你来看!
- 安世半导体&世平集团 高效能&小型化, Nexperia MOSFET的5G解决方案 观看、下载 闯关赢好礼!
- 电源情报站 MPS小程序干货推荐,下载有好礼!3月活动开始啦~
- 下载赢礼 | 雅特生 PMBus 接口非隔离数字 DC-DC 转换器
- 泰克70周年庆 了解新品 参与掀盖有礼活动 最多可获得6次抽奖机会
- 以科技之力,成就安全 PI与您一起驾驭明天的智慧 答题赢好礼!