📄 mcp2515.lst
字号:
211 {
\ WriteBits:
\ 00000000 70402DE9 PUSH {R4-R6,LR}
\ 00000004 08D04DE2 SUB SP,SP,#+8
\ 00000008 0040B0E1 MOVS R4,R0
\ 0000000C 0150B0E1 MOVS R5,R1
\ 00000010 0260B0E1 MOVS R6,R2
212 unsigned char command[4];
213
214 command[0] = BIT_MOD;
\ 00000014 0510A0E3 MOV R1,#+5
\ 00000018 0010CDE5 STRB R1,[SP, #+0]
215 command[1] = Addr;
\ 0000001C 0140CDE5 STRB R4,[SP, #+1]
216 command[2] = mask;
\ 00000020 0260CDE5 STRB R6,[SP, #+2]
217 command[3] = data;
\ 00000024 0350CDE5 STRB R5,[SP, #+3]
218
219 SPI_CfgPCS(AT91C_BASE_SPI0,MCP2515_Cs); // 片选 MCP2515
\ 00000028 0E10A0E3 MOV R1,#+14
\ 0000002C ........ LDR R0,??DataTable14 ;; 0xfffc8000
\ 00000030 ........ BL SPI_CfgPCS
220
221 MCP_Spi0Write ( command,4,0,0 );
\ 00000034 0030A0E3 MOV R3,#+0
\ 00000038 0020A0E3 MOV R2,#+0
\ 0000003C 0410A0E3 MOV R1,#+4
\ 00000040 0D00B0E1 MOVS R0,SP
\ 00000044 ........ BL MCP_Spi0Write
222 DelayF(DelayTime);
\ 00000048 0800A0E3 MOV R0,#+8
\ 0000004C ........ BL DelayF
223 }
\ 00000050 7380BDE8 POP {R0,R1,R4-R6,PC} ;; return
224
225
226 //*****************************************************************************
227 //* 函数名称:ReadStatus
228 //* 函数功能:读 MCP2515 状态
229 //* 入口参数:无
230 //* 返回值 :读取有关发送和接收功能的一些状态位(中文手冊67頁)
231 //*****************************************************************************
\ In section .text, align 4, keep-with-next
232 unsigned char ReadStatus(void)
233 {
\ ReadStatus:
\ 00000000 00402DE9 PUSH {LR}
\ 00000004 0CD04DE2 SUB SP,SP,#+12
234 unsigned char command[4];
235
236 unsigned char status;
237 command[0] = RD_STAT;
\ 00000008 A010A0E3 MOV R1,#+160
\ 0000000C 0410CDE5 STRB R1,[SP, #+4]
238
239 while(r_flag);
\ ??ReadStatus_0:
\ 00000010 ........ LDR R0,??DataTable12 ;; r_flag
\ 00000014 0000D0E5 LDRB R0,[R0, #+0]
\ 00000018 000050E3 CMP R0,#+0
\ 0000001C FBFFFF1A BNE ??ReadStatus_0
240 r_flag = 1;
\ 00000020 ........ LDR R0,??DataTable12 ;; r_flag
\ 00000024 0110A0E3 MOV R1,#+1
\ 00000028 0010C0E5 STRB R1,[R0, #+0]
241
242 SPI_CfgPCS(AT91C_BASE_SPI0,MCP2515_Cs);
\ 0000002C 0E10A0E3 MOV R1,#+14
\ 00000030 ........ LDR R0,??DataTable14 ;; 0xfffc8000
\ 00000034 ........ BL SPI_CfgPCS
243
244 MCP_Spi0Write(command,1,&status,1 );
\ 00000038 0130A0E3 MOV R3,#+1
\ 0000003C 0D20B0E1 MOVS R2,SP
\ 00000040 0110A0E3 MOV R1,#+1
\ 00000044 04008DE2 ADD R0,SP,#+4
\ 00000048 ........ BL MCP_Spi0Write
245
246 DelayF(DelayTime);
\ 0000004C 0800A0E3 MOV R0,#+8
\ 00000050 ........ BL DelayF
247
248 return status;
\ 00000054 0000DDE5 LDRB R0,[SP, #+0]
\ 00000058 0E80BDE8 POP {R1-R3,PC} ;; return
249 }
250
251
252 //*********************************************************************************
253 //* 函数名称:MCP2515_CanPoll
254 //* 函数功能: 查询是否收到CAN数据:
255 //* 入口参数: 无
256 //* 返回值 : 3:没有收到
257 //* 4:缓冲区0收到数据
258 //* 5:缓冲区1收到数据
259 //* 6:两个缓冲区都收到数据
260 //**********************************************************************************
\ In section .text, align 4, keep-with-next
261 unsigned char MCP2515_CanPoll(void)
262 {
\ MCP2515_CanPoll:
\ 00000000 10402DE9 PUSH {R4,LR}
263 unsigned char polldata;
264
265 polldata = ReadStatus() & 0x03; //CANINTF & 0x03
\ 00000004 ........ BL ReadStatus
\ 00000008 030010E2 ANDS R0,R0,#0x3
\ 0000000C 0040B0E1 MOVS R4,R0
266
267 return polldata+3;
\ 00000010 030094E2 ADDS R0,R4,#+3
\ 00000014 FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 00000018 1080BDE8 POP {R4,PC} ;; return
268 }
269
270
271 //===================================================================
272 //*函数名称:MCP2515_SetBandRate
273 //*函数功能: 波特率设置
274 //*入口参数: 1.bandrate : 波特率
275 //* 2.IsBackNormal : 1: 使用外部时钟 0: 不使用外部时钟
276 //*返回值 : 无
277 //===================================================================
\ In section .text, align 4, keep-with-next
278 void MCP2515_SetBandRate(CanBandRate bandrate, unsigned char IsBackNormal)
279 {
\ MCP2515_SetBandRate:
\ 00000000 70402DE9 PUSH {R4-R6,LR}
\ 00000004 0040B0E1 MOVS R4,R0
\ 00000008 0150B0E1 MOVS R5,R1
280 unsigned char tmp = 0;
\ 0000000C 0000A0E3 MOV R0,#+0
\ 00000010 0060B0E1 MOVS R6,R0
281
282 MCP2515_Write(CANCTRL, MODE_CONFIG); //进入到配置模式
\ 00000014 8010A0E3 MOV R1,#+128
\ 00000018 0F00A0E3 MOV R0,#+15
\ 0000001C ........ BL MCP2515_Write
283
284 MCP2515_Read(0x0E,tmp); //读取 CAN 状态(0xXE)
\ 00000020 0610B0E1 MOVS R1,R6
\ 00000024 FF1011E2 ANDS R1,R1,#0xFF ;; Zero extend
\ 00000028 0E00A0E3 MOV R0,#+14
\ 0000002C ........ BL MCP2515_Read
285
286 switch(bandrate)
\ 00000030 0400B0E1 MOVS R0,R4
\ 00000034 FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 00000038 0B0050E3 CMP R0,#+11
\ 0000003C 7C00008A BHI ??MCP2515_SetBandRate_1
\ 00000040 04108FE2 ADR R1,??MCP2515_SetBandRate_0
\ 00000044 0010D1E7 LDRB R1,[R1, R0]
\ 00000048 01F18FE0 ADD PC,PC,R1, LSL #+2
\ ??MCP2515_SetBandRate_0:
\ 0000004C 020C1620 DC8 +2,+12,+22,+32
\ 00000050 2A343E48 DC8 +42,+52,+62,+72
\ 00000054 525C6670 DC8 +82,+92,+102,+112
287 {
288 case BandRate_10kbps: //波特率NBR = 1/(同步段+传播段+相位缓冲段1(PS1)+相位缓冲段2(PS2))
289 MCP2515_Write(CNF1, SJW1|0x31); //Synchronization Jump Width Length(同步跳转宽度 SJW ) =1 TQ
\ ??MCP2515_SetBandRate_2:
\ 00000058 3110A0E3 MOV R1,#+49
\ 0000005C 2A00A0E3 MOV R0,#+42
\ 00000060 ........ BL MCP2515_Write
290 //BRP = 0x31
291 //TQ = 2*(BRP+1)/Fosc = 625ns (Fosc = 16MHz)
292 //Sync Seg(同步段) = 1TQ
293 MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1(相位缓冲段1) = 4TQ, Prop Seg(传播) = 7TQ
\ 00000064 9E10A0E3 MOV R1,#+158
\ 00000068 2900A0E3 MOV R0,#+41
\ 0000006C ........ BL MCP2515_Write
294 MCP2515_Write(CNF3, SEG4); // Phase Seg 2(相位缓冲段2) = 4TQ
\ 00000070 0310A0E3 MOV R1,#+3
\ 00000074 2800A0E3 MOV R0,#+40
\ 00000078 ........ BL MCP2515_Write
\ 0000007C 6C0000EA B ??MCP2515_SetBandRate_1
295 break; //NBR = 1/((1+7+4+4)*6.25ns)
296
297 case BandRate_20kbps:
298 MCP2515_Write(CNF1, SJW1|0x18); //Synchronization Jump Width Length =1 TQ
\ ??MCP2515_SetBandRate_3:
\ 00000080 1810A0E3 MOV R1,#+24
\ 00000084 2A00A0E3 MOV R0,#+42
\ 00000088 ........ BL MCP2515_Write
299 MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1 = 4, Prop Seg = 7
\ 0000008C 9E10A0E3 MOV R1,#+158
\ 00000090 2900A0E3 MOV R0,#+41
\ 00000094 ........ BL MCP2515_Write
300 MCP2515_Write(CNF3, SEG4); // Phase Seg 2 = 4
\ 00000098 0310A0E3 MOV R1,#+3
\ 0000009C 2800A0E3 MOV R0,#+40
\ 000000A0 ........ BL MCP2515_Write
\ 000000A4 620000EA B ??MCP2515_SetBandRate_1
301 break;
302
303 case BandRate_50kbps:
304 MCP2515_Write(CNF1, SJW1|0x9); //Synchronization Jump Width Length =1 TQ
\ ??MCP2515_SetBandRate_4:
\ 000000A8 0910A0E3 MOV R1,#+9
\ 000000AC 2A00A0E3 MOV R0,#+42
\ 000000B0 ........ BL MCP2515_Write
305 MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1 = 4, Prop Seg = 7
\ 000000B4 9E10A0E3 MOV R1,#+158
\ 000000B8 2900A0E3 MOV R0,#+41
\ 000000BC ........ BL MCP2515_Write
306 MCP2515_Write(CNF3, SEG4); // Phase Seg 2 = 4
\ 000000C0 0310A0E3 MOV R1,#+3
\ 000000C4 2800A0E3 MOV R0,#+40
\ 000000C8 ........ BL MCP2515_Write
\ 000000CC 580000EA B ??MCP2515_SetBandRate_1
307 break;
308
309 case BandRate_62kbps:
310 MCP2515_Write(CNF1, SJW1|0x7); //Synchronization Jump Width Length =1 TQ
\ ??MCP2515_SetBandRate_5:
\ 000000D0 0710A0E3 MOV R1,#+7
\ 000000D4 2A00A0E3 MOV R0,#+42
\ 000000D8 ........ BL MCP2515_Write
311 MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1 = 4, Prop Seg = 7
\ 000000DC 9E10A0E3 MOV R1,#+158
\ 000000E0 2900A0E3 MOV R0,#+41
\ 000000E4 ........ BL MCP2515_Write
312 MCP2515_Write(CNF3, SEG4);// Phase Seg 2 = 4
\ 000000E8 0310A0E3 MOV R1,#+3
\ 000000EC 2800A0E3 MOV R0,#+40
\ 000000F0 ........ BL MCP2515_Write
\ 000000F4 4E0000EA B ??MCP2515_SetBandRate_1
313 break;
314
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -