OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2793|回复: 4

CAN 通讯问题

[复制链接]

7

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2016-2-26
在线时间
41 小时
发表于 2018-3-22 15:29:12 | 显示全部楼层 |阅读模式
1金钱
是这样的:
cpu : stm32f207
CAN TX: PD1
CAN RX: PD0
用can总线与一个泵通讯
波特率为250

设备给泵发出ID18ffdf00,数据为00 00 00 00 08 02 28 20
泵接收到这个ID和数据后,反馈回的ID18ffde3d,数据为00 00 00 00 02 00 00 c6

现在发送了,么有反应

源代码如下:


void CANDevice::ModuleInit(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

  /* CAN register init */
  CAN_DeInit(CAN1);

  CAN_InitTypeDef CAN_InitStructure;
  CAN_StructInit(&CAN_InitStructure);

  /*外设时钟设置*/
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD ,ENABLE);
// RCC_APB1PeriphClockCmd( RCC_APB1Periph_GPIOB, ENABLE);//使能PORTB时钟        
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟        

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用推挽
  GPIO_Init(GPIOD, &GPIO_InitStructure);                //初始化IO

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//上拉输入
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化IO

  /* CAN cell init */
  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;
  CAN_InitStructure.CAN_TXFP = DISABLE;
// CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;

  /* Baudrate = 500 Kbps */ //250
  CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
  CAN_InitStructure.CAN_Prescaler = 8;//4
  CAN_Init(CAN1, &CAN_InitStructure);


  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  CAN_FilterInitStructure.CAN_FilterNumber = 1;
  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 = CAN_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);

  /* CAN FIFO0 message pending interrupt enable */
  CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}

/***************************************************************************
*  Function:      void SendOneFrameData(INT32U ulID, const INT8U* pBuff, INT8U ucLenght)
*  Description:   CAN发送一帧数据
*  Input:         INT32U ulID: ID地址
*                 const INT8U* pBuff: 数据
*                 INT8U ucLenght: 数据的长度
*  Output:
*  Others:        
***************************************************************************/
void CANDevice::SendOneFrameData(INT32U ulID, const INT8U* pBuff, INT8U ucLenght)
{
  u16 send_i=0,i;
  if ( ucLenght > CAN_FARAM_SIZE )    return;
  CanTxMsg* pMeg = (CanTxMsg*)AllocGeneralBuff(sizeof(CanTxMsg));
  pMeg->StdId = ulID;
  pMeg->ExtId = 0;
  pMeg->IDE = CAN_ID_STD;
  pMeg->RTR = CAN_RTR_DATA;
  pMeg->DLC = ucLenght;
for(send_i=0;send_i<ucLenght;send_i++)
    {pMeg->Data[send_i]=pBuff[send_i];}  
  memcpy(pMeg->Data, pBuff, ucLenght);
CAN_Transmit(CAN1, pMeg);
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1669
金钱
1669
注册时间
2018-1-29
在线时间
160 小时
发表于 2018-3-22 19:57:34 | 显示全部楼层
泵的CAN控制程序也是你写的吗?泵的地址掩码你知道吗?
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2013-11-27
在线时间
518 小时
发表于 2018-3-22 21:56:15 | 显示全部楼层
端口复用没有打开 当然没有反映
回复

使用道具 举报

0

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2018-3-14
在线时间
19 小时
发表于 2018-3-23 08:43:32 | 显示全部楼层
这种问题,先在CAN总线上抓数据,再到UART口抓数据,就很容易知道哪出错了撒。
回复

使用道具 举报

7

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2016-2-26
在线时间
41 小时
 楼主| 发表于 2018-3-23 09:00:16 | 显示全部楼层
wmh19910511 发表于 2018-3-22 21:56
端口复用没有打开 当然没有反映

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//上拉输入
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化IO

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//上拉输入

要改为复用模式?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 23:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表