📄 ican-mcp2515.lst
字号:
###############################################################################
# #
# 04/Dec/2008 16:07:55 #
# IAR ARM ANSI C/C++ Compiler V5.11.0.20622/W32 EVALUATION #
# Copyright 1999-2007 IAR Systems. All rights reserved. #
# #
# Cpu mode = thumb #
# Endian = little #
# Source file = E:\ELE\yten\pro\message\ican-mcp2515.c #
# Command line = E:\ELE\yten\pro\message\ican-mcp2515.c -D EMB_FLASH #
# -lcN E:\ELE\yten\pro\Release\List\ -o #
# E:\ELE\yten\pro\Release\Obj\ --no_cse --no_unroll #
# --no_inline --no_code_motion --no_tbaa --no_clustering #
# --no_scheduling --debug --endian little --cpu Cortex-M3 #
# -e --fpu None --dlib_config "C:\Program Files\IAR #
# Systems\Embedded Workbench 5.0 #
# Evaluation\ARM\INC\DLib_Config_Normal.h" -I #
# E:\ELE\yten\pro\ -I E:\ELE\yten\pro\..\LIBRARY\INC\ -I #
# "C:\Program Files\IAR Systems\Embedded Workbench 5.0 #
# Evaluation\ARM\INC\" -On #
# List file = E:\ELE\yten\pro\Release\List\ican-mcp2515.lst #
# Object file = E:\ELE\yten\pro\Release\Obj\ican-mcp2515.o #
# #
# #
###############################################################################
E:\ELE\yten\pro\message\ican-mcp2515.c
1 ////////////////////////
2 #include "includes.h"
3 #include"ytep.h"
4 #include"can.h"
5 const Int8U CAN_BAUD[]={1,4,18};
6 ////////////////////////
7 //------------------------------------
8 void WriteSPI(unsigned char DataOut)
9 {
10 unsigned char n;
11
12 Clr_bit(IO_mSCK,mSCK) ; //Make sure clock is low
13
14 for(n=0; n<8; n++)
15 {
16 if((DataOut << n) & 0x80)Set_bit(IO_mSI,mSI); //mSII = 1;
17 else Clr_bit(IO_mSI,mSI) ; //Clock a 0
18 asm("nop");
19 asm("nop");
20 asm("nop");
21
22 Set_bit(IO_mSCK,mSCK); //mSCK = 1; //Pulse clock // mSCK = 0; //
23 asm("nop");
24 asm("nop");
25 asm("nop");
26 asm("nop");
27 asm("nop");
28
29 Clr_bit(IO_mSCK,mSCK);
30 asm("nop");
31 asm("nop");
32 asm("nop");
33 asm("nop");
34
35 Clr_bit(IO_mSI,mSI) ;
36 }
37 }
38
39 /********************************************************************/
40 unsigned char ReadSPI( void )
41 {
42 unsigned char n, DataIn = 0;
43
44 Clr_bit(IO_mSCK,mSCK); //mSCK = 0; //Make sure clock is low
45 for(n=0; n<7; n++)
46 {
47 Set_bit(IO_mSCK,mSCK) ; //mSCK = 1;
48 asm("nop");
49 asm("nop");
50 if(Get_bit(IO_mSO,mSO))DataIn|=1;
51 else DataIn&=0xfe;
52
53 DataIn = (DataIn << 1);
54 Clr_bit(IO_mSCK,mSCK);
55 asm("nop");
56 asm("nop");//mSCK = 0;
57 }
58 Set_bit(IO_mSCK,mSCK); //mSCK = 1;
59 if(Get_bit(IO_mSO,mSO))DataIn|=1;
60 else DataIn&=0xfe; //DataIn = DataIn + mSI;
61 Clr_bit(IO_mSCK,mSCK); // mSCK = 0;
62 return DataIn;
63 }
64 //-------------------------------------------------------------
65 //-------------------------------------------------------------------------
66 // SPIByteWrite()
67 //-------------------------------------------------------------------------
68 void SPIByteWrite(unsigned char addr, unsigned char value )
69 {
70 Clr_bit(IO_CS,mCS) ; //mCS = LOW;
71 WriteSPI(CAN_WRITE);
72 WriteSPI(addr);
73 WriteSPI(value);
74 Set_bit(IO_CS,mCS); //mCS = HIGH;;
75 }
76
77
78 //-----------------------------------------------------------------------------
79 // SPIByteRead()
80 //-----------------------------------------------------------------------------
81 unsigned char SPIByteRead(unsigned char addr)
82 {
83 unsigned char tempdata;
84 Clr_bit(IO_CS,mCS); //mCS = LOW;;
85 WriteSPI(CAN_READ);
86 WriteSPI(addr);
87 tempdata = ReadSPI();
88 Set_bit(IO_CS,mCS); //mCS = HIGH;;
89 return tempdata;
90 }
91 //-----------------------------------------------------------------------------
92 // SPIReset()
93 //-----------------------------------------------------------------------------
94 void SPIReset(void)
95 {
96 Clr_bit(IO_CS,mCS);//mCS = LOW;
97 WriteSPI(CAN_RESET);
98 Set_bit(IO_CS,mCS);
99 }
100 SPIFastRead(unsigned char m)
101 {
102 unsigned char tempdata;
103 Clr_bit(IO_CS,mCS); //mCS = LOW;;
104 WriteSPI(m);
105 tempdata = ReadSPI();
106 Set_bit(IO_CS,mCS); //mCS = HIGH;;
107 return tempdata;
108 }
109 SPIFastWrite()
110 {
111 }
112 //-----------------------------------------------------------------------------
113 //----------------------------------------------------
114 void ConfCAN(CAN_BUS *CANx,volatile CAN_BUS *CANS,const Int16U *p)
115 {
116 unsigned char x,y;
117
118
119
120 CANS->SiIDH=*(p+C_PrductADD);//发送的标准标识符滤波10-3 ,产品地址
121
122 CANS->SiIDL=0;
123 if(CANx->SiIDL&0Xe0)CANS->SiIDL|=0xe0;//功能码.标准标识符滤波位0,IDH的b5与IDL的b5
124 CANS->SiIDL|=8; //mcp2515报文滤波用于0=标准帧1=扩展帧//本应用中为扩展帧
125 CANS->EIDM=CANx->EIDM&0xc0;//通讯类型
126 CANS->EIDM|=CANx->SiIDH&0X3F;
127 CANS->EIDL=CANx->EIDL;
128 //CAN.EIDL start address ,CAN.DATA[0] len
129 CANS->DLC=0;
130 x=CANx->EIDL; //起始地址
131 p+=x;
132 for(x=0;(x<4)&&(CANx->DATA[0]!=0);x++)//CAN.DATA[0]数据长度
133 {
134 y=2*x;
135 CANS->DATA[y]=*p/256,CANS->DLC++;;
136 CANS->DATA[y+1]=*p&0xff,CANS->DLC++;;
137 p++;
138 CANx->EIDL++;
139 if(CANx->DATA[0]>=1)CANx->DATA[0]--;
140 else CANx->DATA[0]=0;
141 }
142 if(CANx->DATA[0]==0)CANS->SiIDL|=0x3; // 数据发完时C0
143 else CANS->SiIDL|=0X1;
144 #if 0
145 CANS->SiIDH=0XAA;
146 CANS->EIDM=0XAA;
147 CANS->EIDL=0X1;
148 CANS->DLC=0;
149 CANS->DATA[0]=0XBB;
150 CANS->DATA[1]=0X7F;
151 CANS->DATA[2]=0X7F;
152 CANS->DATA[3]=0X7F;
153 CANS->DATA[4]=0X7F;
154 CANS->DATA[5]=0X7F;
155 CANS->DATA[6]=0X7F;
156 CANS->DATA[7]=0X7F;
157 CANS->SiIDL=8;
158 #endif
159 }
160 //---------------------------------------------------------
161 //---------------------------------------------------------
162 WriteCAN(const CAN_BUS *WCAN,unsigned char c)
163 {
164 unsigned char c1,c2,c3;
165 c3=c;
166 SPIByteWrite(c,WCAN->SiIDH);
167 SPIByteWrite(++c,WCAN->SiIDL);
168 SPIByteWrite(++c,WCAN->EIDM);
169 SPIByteWrite(++c,WCAN->EIDL);
170 SPIByteWrite(++c,WCAN->DLC);
171 c1=WCAN->DLC&0xf;
172 for(c2=0;c2<c1;c2++)
173 SPIByteWrite(++c,WCAN->DATA[c2]);
174
175 if(c3==TXB0SIDH)SPIByteWrite(TXB0CTRL,8);
176 else if(c3==TXB1SIDH)SPIByteWrite(TXB1CTRL,8);
177 else if(c3==TXB2SIDH)SPIByteWrite(TXB2CTRL,8);
178 }
179 /////////////////////////////////////////////////////////////
180
181 void Init2515(Int8U m)
182 {
183 Int16U i;
184 SPIReset();
185 delay_nop(100);
186
187 SPIByteWrite(RXB0CTRL,0x00);//清RXB0
188 //Clear masks to RX all messages
189 SPIByteWrite(RXM0SIDH,0x00);//标准标识低位
190 SPIByteWrite(RXM0SIDL,0x00);//标准标识高位
191 //Clear filter... really only concerned to clear EXIDE bit
192 SPIByteWrite(RXF0SIDH,0x00);//验收滤波器H位
193 SPIByteWrite(RXF0SIDL,0x08);//验收滤波器L位
194 SPIByteWrite(RXF0EID8,0x3F);//验收滤波器扩展8~15位
195 SPIByteWrite(RXF0EID0,0x0);//验收滤波器扩展0-7位
196
197 //Set CNF1
198 m=CAN_RATE_TAB[m];
199 SPIByteWrite(CNF1,m);//分频CAN_125kbps
200
201 //Set CNF2
202 SPIByteWrite(CNF2,0x80 | PHSEG1_3TQ | PRSEG_1TQ);
203
204 //Set CNF3
205 SPIByteWrite(CNF3, PHSEG2_3TQ);
206
207 //Set TXB0 DLC and Data for a "Write Register" Input Message to the MCP25020
208 SPIByteWrite(TXB0SIDH,0xA0); //发送器标识符高位
209 SPIByteWrite(TXB0SIDL,0xe8); //
210 SPIByteWrite(TXB0EID8,0XFF); //发送器扩展8-15位
211 SPIByteWrite(TXB0EID0,0XA8);
212 SPIByteWrite(TXB0DLC,DLC_3);// 发送数据字节长度,0-8字节
213 SPIByteWrite(TXB0D0,0x6); //发送器发送数据D0
214 SPIByteWrite(TXB0D1,0xff); //D1 = Mask = 0x10
215 SPIByteWrite(TXB0D2,0xff);
216
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -