CAN簡介:CAN 是控制器局域網絡 Controller Area Network 的縮寫,是 ISO 國際標準化的串行通信協議,支持 CAN 協議 2.0A 和 2.0B。在 CAN 協議中,發送者以廣播形式把報文發送給所有接收者,節點在接收報文時,會經過過濾器組根據標識符決定是否需要該報文,這種設計節省了 CPU 的開銷。
APM32E103系列支持CAN協議 2.0A 和 2.0B,通信波特率最大為 1Mbit/s,并且擁有雙CAN接口,能適應更多的應用場合。
偶爾會有三個以上CAN接口需求或者需要在沒有CAN接口的芯片上使用CAN,就可以考慮使用外接協議轉換芯片,將其他通訊接口轉接成CAN接口。
查找發現比較常用的就是MCP2515,帶有SPI接口的獨立CAN控制器。
MCP2515是獨立的控制器局域網(CAN)控制器,實現CAN規范,版本2.0B。它是有能力的發送和接收標準和擴展數據和遠程幀。MCP2515有兩個接受掩碼和六個接受過濾器被用來過濾掉不需要的消息,因此減少了主機MCU的開銷。MCP2515與微控制器(mcu)的連接通過一個工業標準串行外設接口(SPI)來實現的。
在網上可以直接買到MCP2515的模塊,方便直接在開發板上用杜邦線接出來測試。
附帶的資料包是基于51單片機的例程,需要修改移植到APM32的例程中。
移植基于APM32E10x_SDK_V1.2中的SPI_FullDuplex例程進行修改移植。
為了方便使用,硬件SPI和軟件SPI都進行了定義初始化,通過宏定義來切換。
#defineSPI_S//SPI_H
軟件SPI只需要初始化用到的IO引腳,硬件SPI就需要對SPI進行初始化配置。
MCP2515有一個中斷腳,在總線上有CAN型號是會有下拉型號,告訴MCU需要準備進入接收狀態。
所以需要在MCU上配置個外部中斷引腳,用于快速響應。
voidMCP2515_GPIO_Init(void)
{
GPIO_Config_TGPIO_configStruct;
EINT_Config_T EINT_configStruct;
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
GPIO_configStruct.pin =GPIO_PIN_0;
GPIO_configStruct.mode =GPIO_MODE_IN_PU;
GPIO_Config(GPIOA,&GPIO_configStruct);
GPIO_ConfigEINTLine(GPIO_PORT_SOURCE_A,GPIO_PIN_SOURCE_0);
/* Configure Button EINT line*/
EINT_configStruct.line=EINT_LINE_0;
EINT_configStruct.mode =EINT_MODE_INTERRUPT;
EINT_configStruct.trigger =EINT_TRIGGER_FALLING;
EINT_configStruct.lineCmd =ENABLE;
EINT_Config(&EINT_configStruct);
/* Enable and setButton EINT Interrupt to the lowest priority */
NVIC_EnableIRQRequest(EINT0_IRQn,0x0f, 0x0f);
}
SPI初始化完成后需要對MCU2515的寄存器進行初始化配置,配置CAN通訊的波特率工作模式等。
voidMCP2515_Init(void)
{
u16 i=0;
unsigned char temp=0;
MCP2515_Reset(); //發送復位指令軟件復位MCP2515
Delay_Nms(1); //通過軟件延時約nms(不準確)
//設置波特率為250Kbps
MCP2515_WriteByte(CNF1,CAN_250Kbps);
MCP2515_WriteByte(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);
MCP2515_WriteByte(CNF3,PHSEG2_3TQ);
MCP2515_WriteByte(TXB0SIDH,0xFF);//發送緩沖器0標準標識符高位
MCP2515_WriteByte(TXB0SIDL,0xE0);//發送緩沖器0標準標識符低位
MCP2515_WriteByte(RXB0SIDH,0x00);//清空接收緩沖器0的標準標識符高位
MCP2515_WriteByte(RXB0SIDL,0x00);//清空接收緩沖器0的標準標識符低位
MCP2515_WriteByte(RXB0CTRL,0x20);//僅僅接收標準標識符的有效信息
MCP2515_WriteByte(RXB0DLC,DLC_8);//設置接收數據的長度為8個字節
MCP2515_WriteByte(RXF0SIDH,0x00);//配置驗收濾波寄存器n標準標識符高位
MCP2515_WriteByte(RXF0SIDL,0x00);//配置驗收濾波寄存器n標準標識符低位
MCP2515_WriteByte(RXM0SIDH,0x00);//配置驗收屏蔽寄存器n標準標識符高位
MCP2515_WriteByte(RXM0SIDL,0x000);//配置驗收屏蔽寄存器n標準標識符低
MCP2515_WriteByte(CANINTF,0x00);//清空CAN中斷標志寄存器的所有位(必須由MCU清空)
MCP2515_WriteByte(CANINTE,0x01);//配置CAN中斷使能寄存器的接收緩沖器0滿中斷使能,其它位禁止中斷
MCP2515_WriteByte(CANCTRL,REQOP_LOOPBACK|CLKOUT_ENABLED);//將MCP2515設置為環回模式,退出配置模式
temp=MCP2515_ReadByte(CANSTAT);//讀取CAN狀態寄存器的值
if(OPMODE_NORMAL!=(temp &&0xE0))//判斷MCP2515是否已經進入正常模式
{
MCP2515_WriteByte(CANCTRL,REQOP_LOOPBACK|CLKOUT_ENABLED);//再次將MCP2515設置為環回模式,退出配置模式
}
}
MCP2515的初始化部分基本結束,接下來就是到main中編寫個收發測試。
可以看到MCP2515是配置成環回模式,也就是自發自收,方便測試SPI配置和MCP2515的配置是否正確。
intmain(void)
{
APM_MINI_LEDInit(LED2);
APM_MINI_LEDInit(LED3);
APM_MINI_LEDOff(LED2);
APM_MINI_LEDOff(LED3);
SPI_MCP2515_Init();
MCP2515_Init();
MCP2515_GPIO_Init();
TMR5_INIT();
while(1)
{
//向CAN總線發送數據
if(timer_flag==0x01) //定時發送
{
timer_flag=0x00;
if(++can_tx_msg.StdId>1000)can_tx_msg.StdId=0x00; //CANID每發送一條報文,自加1
memcpy(can_tx_msg.Data, CAN_T_Buffer,8); //取報文數據放入緩沖區
CAN_Send_Buffer(&can_tx_msg);
APM_MINI_LEDToggle(LED2);
}
//接收CAN數據
if(can_tx_flag==0x01) //判斷中斷標志位
{
CAN_Receive_Buffer(&can_rx_msg);
can_tx_flag=0x00;
}
}
}
將杜邦線按照引腳配置,接好線后仿真就能測試回環模式下收發數據了。
可以看到斷點打到接收部分,可以接收到CAN數據,與發送的數據一致。
如果有其他can設備或者CAN分析儀的話,可以將工作模式改成普通模式,進行設備間的通訊。
-
控制器
+關注
關注
112文章
16332瀏覽量
177803 -
接口
+關注
關注
33文章
8575瀏覽量
151015 -
CAN
+關注
關注
57文章
2744瀏覽量
463613 -
局域網絡
+關注
關注
0文章
18瀏覽量
7109
原文標題:APM32芯得 EP.45 | 基于APM32E103 SPI轉CAN芯片MCP2515移植測試
文章出處:【微信號:geehysemi,微信公眾號:Geehy極海半導體】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論