stm32f103rbt6 CAN 通信問題
在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 = CAN_DATA0;
// TxMessage.Data = CAN_DATA1;
// TxMessage.Data = CAN_DATA2;
// TxMessage.Data = CAN_DATA3;
// TxMessage.Data = CAN_DATA4;
// TxMessage.Data = 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=0xAA; //要发送的数据第0字节
TxMessage.Data=0xBB; //要发送的数据第1字节
TxMessage.Data=0xCC;
TxMessage.Data=0xDD;
TxMessage.Data=0xEE;
TxMessage.Data=0xFF;
TxMessage.Data=0x99;
TxMessage.Data=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();
}
}
用示波器看看TX和RX引脚上的波形吧? liucw99 发表于 2017-2-10 20:35
用示波器看看TX和RX引脚上的波形吧?
用示波器看TX和RX沒有波形耶,是不是哪裡設定錯了 有可能是CAN控制器没有工作。另外,你的CAN驱动芯片是什么?工作是否正常?
我当初买到了假的驱动芯片,也是不工作。 先用回环模式测试下能否发出来,这样先验证软件配置。
如果OK 再检查外围硬件 及波特率一致性等。
页:
[1]