STM32F1與STM32F4間CAN通訊調試

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通訊,只要硬件沒問題,同時保證波特率一致,通訊上不會有太大問題。

相關文章
相關標籤/搜索