NXP SJA1124 spi转lin芯片驱动
NXP SJA1124 spi轉lin芯片驅動
文章目錄
- NXP SJA1124 spi轉lin芯片驅動
- 一、總體特點
- 二、工作模式
- 三、spi通信
- 三、lin通信
- 四、芯片寄存器配置
一、總體特點
1.sja1124 是lin控制器和收發器集成一體芯片,支持4路lin通道。
2.支持LIN 2.0, LIN 2.1, LIN 2.2, LIN 2.2A和相關協議國際標準,最快可以達到20kb波特率.
3.通過spi或者lin可以在low power模式下喚醒
4.需要外接時鐘作為lin通信時鐘源。
5.硬件lin通信,只需對寄存器進行配置。
6.結構框架圖
二、工作模式
1.芯片的五種模式如下圖,注意手冊分為芯片模式和lin模式,會有重名的模式,如果涉及到lin的模式會加上lin,不然一般為芯片模式。
2.芯片上電后會有3.2s的INITI idie timeout,沒有在這個時間進行spi通信或者lin喚醒,芯片進入low power模式。
3.lin模式有lin sleep,lin normal,lin initializional。這幾種是lin的模式,比如初始化模式,如果你用幾路lin的話,每一路lin都需要單獨初始化。
三、spi通信
spi通信是8位寄存器,一般和muc的通信注意以下幾個點就行,當然具體的spi通信得看看別人文章學習,不是本文核心,本次我用到的是NXP的汽車級MCU芯片。本次spi通信需要注意一下傳輸幀數,需要3-18幀,而設置幀數量會在第二幀的時候確定,比如我的讀寫都是3幀,所以讀的第二幀是0X80,寫是0X00。
1.時鐘頻率配置位通信頻率涉及波特率配置
/* DBR =0 BR=8 PBR=5 FP=40MHZ BUAD= (40/5)*[(1+0)/8]=1M*/ SPI_2.MODE.CTAR[0].B.PBR=0b10; SPI_2.MODE.CTAR[0].B.BR=0b0011;2.傳輸數據位的寄存器配置比如我用到的一般是默認16位傳輸數據位,需要把FMSZ設置八位
/*frame size*/ SPI_2.MODE.CTAR[0].B.FMSZ=0b0111;3.時鐘極性和相位要和高邊芯片一致才行。SJA1124的時鐘極性和相位分為別0,1
SPI_2.MODE.CTAR[0].B.CPOL=0; //lin芯片極性和相位 0 1 SPI_2.MODE.CTAR[0].B.CPHA=1;4.讀寫函數的偽代碼
u8 FUN_HW_SJA1124_ReadData(u8 address) {u8 data;HW_SJA1124_CS1=0;FUN_HW_Time_Delayus(1);SPI3_SendAndGetData_byte(address,HW_SJA1124_CS1);SPI3_SendAndGetData_byte(SJA1124READ,HW_SJA1124_CS1); //讀8位長數據data=SPI3_SendAndGetData_byte(address,HW_SJA1124_CS1);FUN_HW_Time_Delayus(1);HW_SJA1124_CS1=1;return data; } void FUN_HW_SJA1124_WriteData(u8 address,u8 data) {HW_SJA1124_CS1=0;FUN_HW_Time_Delayus(1);SPI3_SendAndGetData_byte(address,HW_SJA1124_CS1);SPI3_SendAndGetData_byte(SJA1124WRITE,HW_SJA1124_CS1); //讀8位長數據SPI3_SendAndGetData_byte(data,HW_SJA1124_CS1);FUN_HW_Time_Delayus(1);HW_SJA1124_CS1=1;}三、lin通信
1.通信分為主機和從機,本次芯片lin只能作為主機,簡單的描述一下lin通信協議,具體的通信學習還是得去看專業得文章,不是本次重點,本次lin通信是硬件lin,不需要軟件模擬通信協議。
2.lin通信主要分為報頭(header)和回復響應(response)兩個部分.如下圖
3.lin邏輯電平分為顯性(0)和隱性(1)兩種。lin是一主多從通信方式,從機節點一般最多可以到16個,通信過程必須主機先發header,接著從機response,主機在response,然后無限response。
4.報頭分別有間隔場,同步場和標識符場。間隔場一般為大于13個顯性電平bit,而同步場是固定為“0x55"一個字節,標識符則是發送header的PID,PID可以分為ID和奇偶校驗,ID范圍為0-0x3f也就是64,不過很多特殊ID不能用,而這里的奇偶有特別的校驗算法可以查表。
5.響應場就分為數據場和校驗和場,數據場可以是2/4/8字節,一般用8個字節和can差不多。校驗場就校驗和場是數據場所有字節和的反碼。現在一般分為經典型(classic)和增強型(enhanced)。
四、芯片寄存器配置
1.寄存器也和模式一樣,分別芯片寄存器和lin寄存器。
2.首先需對芯片配置寄存器進行初始化,涉及IO、工作模式、時鐘中斷寄存器配置。
void FUN_HW_SJA1124_Init(void) {//引腳初始化SIUL2.MSCR[PC15].B.SSS = 0; /* Pin functionality as GPIO */SIUL2.MSCR[PC15].B.OBE = 1; /* Output Buffer Enable off */SIUL2.MSCR[PC15].B.IBE = 0; /* Input Buffer Enable on *//*clk*/SIUL2.MSCR[PB6].B.SSS = 1; /* Pin functionality as GPIO */SIUL2.MSCR[PB6].B.OBE = 1; /* Output Buffer Enable off *//*模式選擇*/SJA1124.MODE_reg.B.RST=1;//復位SJA1124.MODE_reg.B.LPMODE=0; //0.正常模式 1.低功耗FUN_HW_SJA1124_WriteData(SJA1124MODE,SJA1124.MODE_reg.R);/*時鐘頻率設置*/SJA1124.PLLCFG_reg.B.PLLMULT=0X8;// CLK=32MFUN_HW_SJA1124_WriteData(PLLCFG,SJA1124.PLLCFG_reg.R);//默認開啟喚醒WUIE中斷//開啟所有中斷SJA1124.INT1EN_reg.R=0x0F;FUN_HW_SJA1124_WriteData(INT1EN,SJA1124.INT1EN_reg.R);SJA1124.INT2EN_reg.R=0x3E;FUN_HW_SJA1124_WriteData(INT2EN,SJA1124.INT2EN_reg.R);SJA1124.INT3EN_reg.R=0xFF;FUN_HW_SJA1124_WriteData(INT3EN,SJA1124.INT3EN_reg.R); }3.需要對LIN通道初始化,必須在INIT=1即LIN初始化模式下配置相應的寄存器,主要內容也就是lin通信的檢驗方式,間隔長度,相關寄存器配置,還有波特率和中斷。
void FUN_HW_SJA1124_LIN1Init(void) {/*LIN1 configuration */SJA1124.LCFG1_reg[0].B.CCD=0;//硬件檢驗SJA1124.LCFG1_reg[0].B.MBL=0X3;//break顯性電平長度 16位->13位 官方demoSJA1124.LCFG1_reg[0].B.SLEEP=0;//正常模式SJA1124.LCFG1_reg[0].B.INIT=1;//初始化模式配置必須再初始化模式下FUN_HW_SJA1124_WriteData(LCFG1LIN1,SJA1124.LCFG1_reg[0].R);/*2-bit delimiter*/SJA1124.LCFG2_reg[0].B.TBDE=1;SJA1124.LCFG2_reg[0].B.IOBE=1;FUN_HW_SJA1124_WriteData(LCFG2LIN1,SJA1124.LCFG2_reg[0].R);/*idle on timeout*/SJA1124.LITC_reg[0].B.IOT=1;FUN_HW_SJA1124_WriteData(LITCLIN1,SJA1124.LITC_reg[0].R);/*2 stop bit congfiguraton*/SJA1124.LGC_reg[0].B.STOP=1;FUN_HW_SJA1124_WriteData(LGCLIN1,SJA1124.LGC_reg[0].R);/*response time*/SJA1124.LRTC_reg[0].R=0X0E;//響應時間待定設置的是推薦值FUN_HW_SJA1124_WriteData(LRTCLIN1,SJA1124.LRTC_reg[0].R);/*baud rate 若CLK為16M */SJA1124.LFR_reg[0].B.FBR=0X2;//設置為3FUN_HW_SJA1124_WriteData(LFRLIN1,SJA1124.LFR_reg[0].R);SJA1124.LBRM_reg[0].B.IBR=0X00;//不用高位FUN_HW_SJA1124_WriteData(LBRMLIN1,SJA1124.LBRM_reg[0].R);SJA1124.LBRL_reg[0].B.IBR=LIN1BAUD;//低位104 104*16+3=1667 32M/1667=19200;FUN_HW_SJA1124_WriteData(LBRLLIN1,SJA1124.LBRL_reg[0].R);SJA1124.LCFG1_reg[0].B.INIT=0;//設置回正常模式FUN_HW_SJA1124_WriteData(LCFG1LIN1,SJA1124.LCFG1_reg[0].R);/*interrupt */FUN_HW_SJA1124_WriteData(LIELIN1,0xF7);//使能所有中斷 }4.接著是lin通信的設置,包括ID,數據。
void FUN_HW_SJA1124_LIN1SendFrame( Lin1_PduType* LIN1Frame) {//SJA1124.LC_reg[0].B.HTRQ=1;FUN_HW_SJA1124_WriteData(LIN1LC,SJA1124.LC_reg[0].R); // SJA1124.LCOM2_reg.B.L1HTRQ=1; // FUN_HW_SJA1124_WriteData(LIN1LC,SJA1124.LCOM2_reg.R);SJA1124.LBI_reg[0].B.ID=LIN1Frame->lin1id;//ID標識符設定范圍0-0x3fFUN_HW_SJA1124_WriteData(LIN1LBI,SJA1124.LBI_reg[0].R);SJA1124.LINLBC_reg[0].B.DFL=LIN1Frame->lin1dfl;//字節個數 DFL=value-1SJA1124.LINLBC_reg[0].B.DIR=LIN1Frame->lin1dir;//SJA1124.LINLBC_reg[0].B.CCS=LIN1Frame->lin1ccs;//0為lin2.0 enhaned 校驗版本 1為lin1.3FUN_HW_SJA1124_WriteData(LIN1LBC,SJA1124.LINLBC_reg[0].R);/*tx data*/FUN_HW_SJA1124_WriteData(LIN1LDB1,LIN1Frame->lin1data[0]);FUN_HW_SJA1124_WriteData(LIN1LDB2,LIN1Frame->lin1data[1]);FUN_HW_SJA1124_WriteData(LIN1LDB3,LIN1Frame->lin1data[2]);FUN_HW_SJA1124_WriteData(LIN1LDB4,LIN1Frame->lin1data[3]);FUN_HW_SJA1124_WriteData(LIN1LDB5,LIN1Frame->lin1data[4]);FUN_HW_SJA1124_WriteData(LIN1LDB6,LIN1Frame->lin1data[5]);FUN_HW_SJA1124_WriteData(LIN1LDB7,LIN1Frame->lin1data[6]);FUN_HW_SJA1124_WriteData(LIN1LDB8,LIN1Frame->lin1data[7]);SJA1124.LS_tag[0].R=FUN_HW_SJA1124_ReadData(LIN1STATU);}5.對header和response的結構體設計,通信函數放入結構體就OK。
typedef struct {/* LBI register. */uint8_t lin1id; /* LIN frame identifier. *//* LBC register. */uint8_t lin1dfl; /* Data field length (number of bytes - 1). */Lin_FrameResponseType lin1dir; /* Response type (master or slave response). */Lin_FrameCsModelType lin1ccs; /* Checksum model type (classic or enhanced checksum calculation). *//* LCF register. */uint8_t lin1cf; /* Checksum to be transmitted in case checksum calculation is disabled. *//* LBDx registers. */uint8_t lin1data[8]; /* Pointer to data to send. */ } Lin1_PduType; /* LIN1 Frame configuration. */ Lin1_PduType Frame1 = {.lin1id = 0x20, /* Identifier - ID. */.lin1dfl = 7, /* Data field length = number of data bytes - 1. */.lin1dir = LIN_MASTER_RESPONSE, /* Direction - master to slave. */.lin1ccs = LIN_ENHANCED_CS, /* Enhanced checksum. */.lin1cf = 0x40, /* Checksum - not needed, checksum calculated automatically. */.lin1data = { 0x11, 0x02, 0x31, 0x40, 0x65, 0x36, 0x78, 0x08 }, /* Data to send. */ };6.增加LIN接收部分,需要INTC引腳接到MCU作為外部中斷,然后設置LIN發送結構中的***.lin1dir=LIN_SLAVE_RESPONSE***為接收從機狀態。然后發送報頭從機收到報頭后發出報文,成為一幀返回報文,LIN的接收和發送是分開進行的。
lin通信學習參考:https://blog.csdn.net/m0_50562969/article/details/122041303?spm=1001.2014.3001.5501
總結
以上是生活随笔為你收集整理的NXP SJA1124 spi转lin芯片驱动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3. oracle学习入门系列之三Uni
- 下一篇: 优秀的45个习惯