你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f103rbt6 CAN 通信問題

[复制链接]
Aaronhsu 提问时间:2017-2-10 11:52 /
在CAN 總線上使用兩個節點,一個用stm32 開發板使用normal-mode發送CAN封包,另一個用CAN analyzer接收,但stm32開發板始終無法送出CAN訊息,以下是目前寫的程序,請求協助
//#include "can.h"
#include "stm32f10x_can.h"
//void Delay_ms( uint16_t time_ms );
uint16_t Time2;
uint32_t CAN_ID;
uint32_t CAN_DATA0,CAN_DATA1,CAN_DATA2,CAN_DATA3,CAN_DATA4,CAN_DATA5,CAN_DATA6,CAN_DATA7;
uint8_t CanFlag,Display;
//extern unsigned char send_flag;
extern float ADC_Value;
void Delayms(__IO uint32_t nCount);
void delay_ms(u16 nms);
//Voltage(void);
/* Private function prototypes -----------------------------------------------*/
/**
* @file CAN_Configuration
* @brief Configures the different GPIO ports.
* @param 无
* @retval 无
*/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 | RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PORTA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //IO端口的第11位
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //端口模式为上拉输入方式
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //IO端口的第12位
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //端口模式为复用推拉输出方式
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/**
* @file CAN_Configuration
* @brief Configures the CAN
* @param 无
* @retval 无
*/
void CAN_Configuration(void)
{
/**/
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
/* CAN register init */
CAN_DeInit(CAN1); //复位CAN1的所有寄存器
CAN_StructInit(&CAN_InitStructure); //将寄存器全部设置成默认值
/* CAN cell init */
CAN_InitStructure.CAN_TTCM=DISABLE; //禁止时间触发通信方式
CAN_InitStructure.CAN_ABOM=DISABLE; //禁止CAN总线自动关闭管理
CAN_InitStructure.CAN_AWUM=DISABLE; //禁止自动唤醒模式
CAN_InitStructure.CAN_NART=DISABLE; //禁止非自动重传模式
CAN_InitStructure.CAN_RFLM=DISABLE; //禁止接收FIFO锁定
CAN_InitStructure.CAN_TXFP=DISABLE; //禁止发送FIFO优先级
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; //设置CAN工作方式为正常收发模式
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //设置重新同步跳转的时间量子
CAN_InitStructure.CAN_BS1=CAN_BS1_13tq; //设置字段1的时间量子数
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; //设置字段2的时间量子数
CAN_InitStructure.CAN_Prescaler=9; //配置时间量子长度为1周期
CAN_Init(CAN1, &CAN_InitStructure); //用以上参数初始化CAN1端口
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=0; //选择CAN过滤器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //初始化为标识/屏蔽模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //选择过滤器为32位
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; //过滤器标识号高16位
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //过滤器标识号低16位
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; //根据模式选择过滤器标识号或屏蔽号的高16位
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; //根据模式选择过滤器标识号或屏蔽号的低16位
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; //将FIFO 0分配给过滤器0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //使能过滤器
CAN_FilterInit(&CAN_FilterInitStructure);
}
/**
* @file CanWriteData
* @brief Can Write Date to CAN-BUS
* @param 无
* @retval 无
*/
void CAN_TX(void)
{
// CanTxMsg TxMessage;
// CAN_DATA0=0xaa; CAN_DATA1=0xbb;
// CAN_DATA2=0xcc; CAN_DATA3=0xdd;
// CAN_DATA4=0xee; CAN_DATA5=0xff;
/* transmit */
// TxMessage.StdId = ID; /* 设置标准id 注意标准id的最高7位不能全是隐性(1)。共11位 ,This parameter can be a value between 0 to 0x7FF. */
//TxMessage.ExtId = 0x00; //设置扩展id 扩展id共18位
// TxMessage.RTR = CAN_RTR_DATA; /* 设置为数据帧 */
// TxMessage.IDE = CAN_ID_STD; /* 使用标准id */
// TxMessage.DLC = 6; /* 数据长度, can报文规定最大的数据长度为8字节 */
// TxMessage.Data[0] = CAN_DATA0;
// TxMessage.Data[1] = CAN_DATA1;
// TxMessage.Data[2] = CAN_DATA2;
// TxMessage.Data[3] = CAN_DATA3;
// TxMessage.Data[4] = CAN_DATA4;
// TxMessage.Data[5] = CAN_DATA5;

// CAN_Transmit(CAN,&TxMessage); /* 返回这个信息请求发送的邮箱号0,1,2或没有邮箱申请发送no_box */

CanTxMsg TxMessage;
// CAN_TDT0R_TIME==10;
/* transmit 1 ECU message */
//TxMessage.StdId=0x00; //配置报文的标准标识符
TxMessage.ExtId=0x0CFF3F27; //配置扩屏标识符
TxMessage.IDE=CAN_ID_EXT; //报文使用标准标识符+扩屏标识符方式
TxMessage.RTR=CAN_RTR_DATA; //报文为数据帧
TxMessage.DLC=8; //报文发送数据长度为2字节
TxMessage.Data[0]=0xAA; //要发送的数据第0字节
TxMessage.Data[1]=0xBB; //要发送的数据第1字节
TxMessage.Data[2]=0xCC;
TxMessage.Data[3]=0xDD;
TxMessage.Data[4]=0xEE;
TxMessage.Data[5]=0xFF;
TxMessage.Data[6]=0x99;
TxMessage.Data[7]=0x88;


CAN_Transmit(CAN1,&TxMessage); /* 返回这个信息请求发送的邮箱号0,1,2或没有邮箱申请发送no_box */
//Delayms(100);
delay_ms(100);
//TIM2_delay(delay_time);
//delay_ms(10);
//send_flag=0;
}

int main(void)
{
/* System Clocks Configuration **********************************************/
SystemInit();
GPIO_Configuration();
CAN_Configuration();
while(1)
{
CAN_TX();
}
}

收藏 1 评论4 发布时间:2017-2-10 11:52

举报

4个回答
liucw99 回答时间:2017-2-10 20:35:23
用示波器看看TX和RX引脚上的波形吧?
Aaronhsu 回答时间:2017-2-13 10:39:46
liucw99 发表于 2017-2-10 20:35
用示波器看看TX和RX引脚上的波形吧?

用示波器看TX和RX沒有波形耶,是不是哪裡設定錯了
liucw99 回答时间:2017-2-13 20:52:52
有可能是CAN控制器没有工作。另外,你的CAN驱动芯片是什么?工作是否正常?
我当初买到了假的驱动芯片,也是不工作。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

xmshao 回答时间:2017-2-14 09:45:23
先用回环模式测试下能否发出来,这样先验证软件配置。
如果OK 再检查外围硬件 及波特率一致性等。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版