CAN通訊的調試不單是軟件上的調試,也須要對硬件進行檢查。
原文連接:http://www.javashuo.com/article/p-ojnggxjz-nk.htmlhtml
在調通以前一直有兩個疑惑干擾判斷:(結論在文末)
1.不一樣的CAN芯片是否存在不兼容。
2.不一樣型號的STM32是否CAN通訊是否存在差別。函數
STM32F1與STM32F4之間CAN通訊的調試過程(僅以STM32F1做介紹[標準庫]):
1.肯定引腳與資源
spa
這裏咱們使用PB八、PB9來做爲CAN通訊引腳,單片機上使用CAN1,注意更改引腳映射。設計
GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);
2.肯定波特率
咱們須要獲得的波特率爲1Mbps,用戶手冊上波特率的計算方法以下:
這裏看起來比較複雜,展開後爲:BaudRate=1/((BRP[9:0]+1)*(1+TS1[3:0]+1+TS2[2:0] + 1)*tPCLK);
因爲CAN1掛在在APB1上,tPCLK1爲APB1的外設週期,須要知道其頻率fPCLK1。3d
a.求取頻率
若是使用標準庫能夠採用在main函數加兩行代碼:調試
RCC_ClocksTypeDef get_rcc_clock; RCC_GetClocksFreq(&get_rcc_clock);
並在調試界面中查看(右鍵去掉勾選便可查看10進制數)
PCLK1爲36MHz即APB1外設頻率爲36MHz。code
如使用CubeMX生成代碼,能夠方便查看時鐘樹配置(強烈建議入門STM32的新人嘗試CubeMX,能夠直觀地理解STM32的時鐘樹)htm
b.設定波特率blog
在標準庫中CAN通訊初始化中有:資源
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_9tq; CAN_InitStructure.CAN_BS2=CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler=2;
其中SJW、BS一、BS2分別對應(BRP[9:0]+1)、(TS[3:0]+1)、(TS2[3:0]+1);
當咱們設定BRP[9:0]爲0時公式能夠簡化爲,BaudRate=1/((1+TS[3:0]+1+TS2[2:0] + 1)*tPCLK)=1/(1+BS1+BS2)/tPCLK;(這就是爲什麼SJW一般取CAN_SJW_1tq)
考慮分頻係數Pre=fPCLK1/fPCLK,fPCLK爲CAN1的頻率:
BaudRate=fPCLK1/((1+BS1+BS2)*Pre);前提SJW取CAN_SJW_1tq;
例如:系統主頻72MHz、APB1外設時鐘頻率fPCLK1=32MHz,當我取SJW=CAN_SJW_1tq,BS1=CAN_BS1_9tq,BS2=CAN_BS2_8tq時BaudRate=32/((1+9+8)*2)=1MHz;
關於疑惑:
因爲STM32F1的板子是本身設計並選了新的CAN芯片(便宜),因此一開始會懷疑是CAN芯片的問題。若是兩個CAN都芯片支持咱們所需求的波特率,實際上都可以通訊的,問題在於個人兩個設備CAN芯片都是5V供電,而我在調試時其中一個設備直接使用調試器3.3V供電,致使其沒法正常工做,因此一直不能收發信息。固然後來發現這個問題以後,使用電源同時給兩個設備供電CAN通訊就成功了。
另外一個關於不一樣型號STM32沒法進行CAN通訊的疑惑主要來源於網上的某帖子,僅僅依據芯片主頻不一致而得出這樣的結論,徹底是無稽之談。通常多個STM32之間CAN通訊,只要硬件沒問題,同時保證波特率一致,通訊上不會有太大問題。