1. 今天調試CAN, STM32F334C8T6,做一個生物PCR監測的項目,用到CAN,程序寫完後,調試,發現發送只能發送16幀,而且不能接收,用的是USB2CAN
2. 檢查程序初始化部分如下
u8 CAN1_Init(u16 BaudRate,u8 mode)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
//初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure={
.GPIO_Pin = GPIO_Pin_12,
.GPIO_Mode = GPIO_Mode_AF, //複用功能
.GPIO_OType = GPIO_OType_PP, //推輓輸出
.GPIO_Speed = GPIO_Speed_50MHz, //100MHz
.GPIO_PuPd = GPIO_PuPd_NOPULL, //上拉
};
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA11,PA12
GPIO_InitTypeDef GPIO_InitStructure11={
.GPIO_Pin = GPIO_Pin_11,
.GPIO_Mode = GPIO_Mode_AF, //複用功能
.GPIO_OType = GPIO_OType_PP, //推輓輸出
.GPIO_Speed = GPIO_Speed_50MHz, //100MHz
.GPIO_PuPd = GPIO_PuPd_UP, //上拉
};
GPIO_Init(GPIOA, &GPIO_InitStructure11);//初始化PA11,PA12
GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_9);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_9);
//CAN單元設置
CAN_InitTypeDef CAN_InitStructure={
.CAN_TTCM=DISABLE, //非時間觸發通信模式
.CAN_ABOM=DISABLE, //軟件自動離線管理
.CAN_AWUM=DISABLE, //睡眠模式通過軟件喚醒
.CAN_NART=ENABLE, //禁止報文自動傳送
.CAN_RFLM=DISABLE, //報文不鎖定,新的覆蓋舊的
.CAN_TXFP=DISABLE, //優先級由報文標識符決定
.CAN_Mode= mode, //模式設置
.CAN_SJW=CAN_SJW_1tq, //重新同步跳躍寬度(Tsjw)爲tsjw+1個時間單位
.CAN_BS1=CAN_BS1_6tq, //CAN_BS2_5tq,Tbs1範圍CAN_BS1_1tq ~CAN_BS1_16tq
.CAN_BS2=CAN_BS2_5tq, //CAN_BS1_6tq,Tbs2範圍CAN_BS2_1tq ~ CAN_BS2_8tq
.CAN_Prescaler=BaudRate, //12,BaudRate,分頻係數(Fdiv)爲brp+1
};
CAN_Init(CAN1, &CAN_InitStructure);// 初始化CAN1//配置過濾器
CAN_FilterInitTypeDef CAN_FilterInitStructure0={
.CAN_FilterNumber=CAN_Filter_FIFO0, //過濾器0
.CAN_FilterMode=CAN_FilterMode_IdMask,
.CAN_FilterScale=CAN_FilterScale_32bit, //32位
.CAN_FilterIdHigh=00, //16, 32位ID
.CAN_FilterIdLow=0x0000,
.CAN_FilterMaskIdHigh=0x0000, //0xff,32位MASK
.CAN_FilterMaskIdLow=0x0000,
.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0,//過濾器0關聯到FIFO0
.CAN_FilterActivation=ENABLE, //激活過濾器0
};
CAN_FilterInit(&CAN_FilterInitStructure0); //濾波器初始化
CAN_FilterInitTypeDef CAN_FilterInitStructure1={
.CAN_FilterNumber=CAN_Filter_FIFO1, //過濾器1
.CAN_FilterMode=CAN_FilterMode_IdMask,
.CAN_FilterScale=CAN_FilterScale_32bit, //32位
.CAN_FilterIdHigh=0x00FF, //網絡參數更改
.CAN_FilterIdLow=0x0000,
.CAN_FilterMaskIdHigh=0x00FF, //32位MASK
.CAN_FilterMaskIdLow=0x0000,
.CAN_FilterFIFOAssignment=CAN_Filter_FIFO1, //過濾器0關聯到FIFO0
.CAN_FilterActivation=ENABLE, //激活過濾器0
};
CAN_FilterInit(&CAN_FilterInitStructure1); //濾波器初始化
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE); //FIFO1消息掛號中斷允許
NVIC_InitTypeDef NVIC_InitStructure0={
.NVIC_IRQChannel = CAN1_RX0_IRQn,
.NVIC_IRQChannelPreemptionPriority = 1, // 主優先級爲1
.NVIC_IRQChannelSubPriority = 0, // 次優先級爲0
.NVIC_IRQChannelCmd = ENABLE,
};
NVIC_Init(&NVIC_InitStructure0);
CAN_ITConfig(CAN1,CAN_IT_FMP1,ENABLE); //FIFO1 消息掛號中斷允許
NVIC_InitTypeDef NVIC_InitStructure1={
.NVIC_IRQChannel = CAN1_RX1_IRQn,
.NVIC_IRQChannelPreemptionPriority = 1, // 主優先級爲1
.NVIC_IRQChannelSubPriority = 2, // 次優先級爲0
.NVIC_IRQChannelCmd = ENABLE,
};
NVIC_Init(&NVIC_InitStructure1);
return 0;
}
波特率是250K,計算一下 36MHZ/分頻/(1+6+5),CAN_SJW_1tq,CAN_BS1_6tq,CAN_BS2_5tq,剛好是250K
GPIO看了文檔也是OK
濾波器設置也是參照我以前的407的(CAN OK),
3.檢查了發送程序
u8 CAN_DataSend(MsgFrame const Msg)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
BIT32 ExtID;
//源地址
ExtID.Bit8.Bit8[3] = 16;
//目的地址
ExtID.Bit8.Bit8[2] = Msg.MsgInfo.fAddr;
//指令
ExtID.Bit8.Bit8[1] = Msg.Bit8[3];
ExtID.Bit8.Bit8[0] = 0;
TxMessage.StdId = 0x0; // 標準標識符爲0
TxMessage.ExtId = ExtID.Int>>3; // 設置擴展標示符(29位)
TxMessage.IDE = CAN_Id_Extended; // 使用擴展標識符
TxMessage.RTR = 0; // 消息類型爲數據幀,一幀8位
TxMessage.DLC = 8; // 發送兩幀信息
//拷貝數據
memcpy(&TxMessage.Data[i],&(Msg.Bit8[5]),8);
//傳輸數據
mbox= CAN_Transmit(CAN1, &TxMessage);
while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))
i++;//等待發送結束
if(i>=0XFFF)return 0;
return 1;
}
和以前也是一樣的,同時,用邏輯分析器,看也有波形。也有數據,但爲啥還是不能連續發送呢?有點迷茫
4. 還是再看看電路圖吧(不是我畫的,我同事畫的),發現沒有接120R電阻,以前記得要接120R,找同事要幾個120R電阻
接上去,測試,發現OK。
5.測試一下接收,也是OK
void CAN1_RX0_IRQHandler(void)
{
if(CAN_GetFlagStatus(CAN1,CAN_FLAG_FMP0))
{
memset(&CANRxBuffer,0,sizeof(CanRxMsg));
CAN_Receive(CAN1, CAN_FIFO0, &CANRxBuffer);
if(CAN1FrameHandler!=NULL)
{
CAN1FrameHandler();
}
}
CAN_ClearFlag(CAN1,CAN_FLAG_FMP0);
}
6. 折騰了一天的問題,終於解決了。