📄 canceshi.lst
字号:
139 ** Value 写入寄存器的值
140 ** 返回值: 1 写入正确
141 ** 0 写入不正确
142 /*------------------------------------------------------------------------------------------------------*/
143 bit WriteSJAReg(unsigned char RegAdr,unsigned char Value)
144 {
145 1
146 1 SJA_CS_Point = CAN_SJA_BaseAdr+RegAdr; //
147 1 *SJA_CS_Point =(*SJA_CS_Point|Value);
148 1 _nop_();
149 1 _nop_();
150 1 if(*SJA_CS_Point ==(*SJA_CS_Point|Value))
151 1 {
152 2 return 0;
153 2 }
154 1 else
155 1 {
156 2 return 1;
157 2 }
158 1
159 1 }
160 /*------------------------------------------------------------------------------------------------------
---
161 ** 函数原型: WriteSJAReg(unsigned char RegAdr,unsigned char Value)
162 ** 功能描述: 该函数用于将指定的数值写入sja1000的指定的寄存器
163 ** 参数说明: RegAdr 要读的sja1000的内部寄存器地址
164 ** Value 写入寄存器的值
165 ** 返回值: 1 写入正确
166 ** 0 写入不正确
167 适合于向内部寄存器中某存储单元写数据。写入的是一个字节
168 /*------------------------------------------------------------------------------------------------------*/
169 bit WriteSJARegByte(unsigned char RegAdr,unsigned char Value)
170 {
171 1
172 1 SJA_CS_Point = CAN_SJA_BaseAdr+RegAdr; //
173 1 *SJA_CS_Point =Value;
174 1 _nop_();
C51 COMPILER V7.06 CANCESHI 01/07/2008 08:46:41 PAGE 4
175 1 _nop_();
176 1 if(*SJA_CS_Point ==Value)
177 1 {
178 2 return 0;
179 2 }
180 1 else
181 1 {
182 2 return 1;
183 2 }
184 1
185 1 }
186 /*----------------------------------------------------------------------------------------------------
-----
187 ** 函数原型: void SJA1000_Config_Normal(void)
188 ** 功能描述: 对SJA1000的正常模式的初始化配置
189 ** 参数说明: 无
190 ** 返回值: 无
191 /*------------------------------------------------------------------------------------------------------*/
-
192 void SJA1000_Config_Normal(void) //正常模式的初始化
193 { bit SJAReg_bz=1;
194 1 BTR0=0x01;
195 1 BTR1=0x1c; //设置为250kb波特率通信
196 1
197 1 while(SJAReg_bz)
198 1 {SJAReg_bz=WriteSJARegByte(REG_CAN_TEST,0xaa);} //测试接口
199 1 SJAReg_bz=1;
200 1 while(SJAReg_bz)
201 1 {SJAReg_bz=WriteSJARegByte(REG_CAN_TEST,0x55);}
202 1 SJAReg_bz=1;
203 1 while(SJAReg_bz)
204 1 {SJAReg_bz=SJAEntryResetMode();} //进入复位模式
-
205 1 WriteSJARegByte(REG_CAN_CDR,0xc8); //配置时钟分频寄存器,选择PeliCAN模式
206 1 SJAReg_bz=1;
207 1 while(SJAReg_bz)
208 1 {SJAReg_bz=WriteSJAReg(REG_CAN_MOD,0x01);} //配置模式寄存器,选择双滤波、正常模式
209 1 WriteSJARegBlock(16,Send_CAN_Filter,8); //配置验收代码/屏蔽寄存器
210 1 SJAReg_bz=1;
211 1 while(SJAReg_bz)
212 1 {SJAReg_bz=WriteSJARegByte(REG_CAN_BTR0,BTR0);} //配置总线定时器0
213 1 SJAReg_bz=1;
214 1 while(SJAReg_bz)
215 1 {SJAReg_bz=WriteSJARegByte(REG_CAN_BTR1,BTR1);} //配置总线定时器1
216 1 WriteSJARegByte(REG_CAN_OCR,0x1a); //配置输出管脚
217 1 SJAReg_bz=1;
218 1 while(SJAReg_bz)
219 1 {SJAReg_bz=SJAQuitResetMode();} //退出复位模式,进入工作模式
220 1 }
221 /*------------------------------------------------------------------------------------------------------*/
222
223
224
225 main()
226 { //IP=1;
227 1 //IPH=1;
228 1 //TMOD=0x21;
229 1 // TH0=0x00;
230 1 // TL0=0x00; //定时器0设置,暂时先开开,可能用不上
231 1 // TR0=1;
232 1 //ET0=1;
233 1 //RCLK=1;
C51 COMPILER V7.06 CANCESHI 01/07/2008 08:46:41 PAGE 5
234 1 //TCLK=1; //定时器2用作波特率发生器 T2CON中的值
235 1 //RCAP2H=0xff;
236 1 //RCAP2L=0xB8; //初步设定波特率为9600
237 1 //SCON=0x50; //串口方式为模式1,无校验,定时器2产生波特率
238 1 //TR2=1; //开定时器2
239 1 //ES=1; //使能串口
240 1
241 1 while (1)
242 1 {
243 2 CS_SJA1000=0;//开片选信号
244 2 _nop_();
245 2 _nop_();
246 2 _nop_();
247 2 _nop_();
248 2 _nop_();
249 2 _nop_();
250 2 SJA_CS_Point=&CAN_SJA_BaseAdr; //确定基址指针的值
251 2 SJA1000_HardwareRst();
252 2 SJA1000_Config_Normal(); //调用SJA1000初始化配置函数
253 2
254 2 SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_SR;
255 2 while((*SJA_CS_Point&0x01) == RBS_BIT)
256 2 { unsigned char TempData,j;
257 3 TempData=*SJA_CS_Point&0x0F; //取数据字节数目
258 3 TempData=TempData+0x04; //ID29位加上数据的字节数 ,不用要信息帧。
259 3 for(j=0;j<TempData;j++) //开始将接收到的TempData个字节的数据存到CPU的
-数据缓冲区里
260 3 {
261 4 SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_TXBUF1+j;
262 4 Rev_CAN_data[j] = *SJA_CS_Point;
263 4 }
264 3 SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_CMR; //释放接收缓冲区,可以直接接收了
265 3 *SJA_CS_Point = RRB_BIT;
266 3 }
267 2 }
268 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 481 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 28 ----
PDATA SIZE = ---- ----
DATA SIZE = 24 8
IDATA SIZE = ---- ----
BIT SIZE = 4 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -