📄 sja_bcanfunc.lst
字号:
151 1 if(CAN_ByteRate>14){
152 2 ErrorFlag =1;
153 2 }
154 1 else{
155 2 while(--ErrorCount){
156 3 WriteSjaReg(REG_BTR0,SJA_BTR_CODETAB[CAN_ByteRate*2]);
157 3 WriteSjaReg(REG_BTR1,SJA_BTR_CODETAB[CAN_ByteRate*2+1]);
158 3 if(ReadSjaReg(REG_BTR0) != SJA_BTR_CODETAB[CAN_ByteRate*2])continue;
159 3 if(ReadSjaReg(REG_BTR1) != SJA_BTR_CODETAB[CAN_ByteRate*2+1])continue;
160 3 ErrorFlag=0;
161 3 break;
162 3
163 3 }//while结束
164 2
165 2 }
166 1 return ErrorFlag ;
167 1 }
168
169
170 /************************************************************************
171 ;*函数原型: BCAN_SET_OBJECT *
172 *参数说明: *
173 * BCAN_ACR:存放验收代码寄存器(ACR)的参数设置 *
174 * BCAN_AMR:存放接收屏蔽寄存器(AMR)的参数设置 *
175 ;*返回值: *
C51 COMPILER V7.20 SJA_BCANFUNC 02/23/2006 10:58:24 PAGE 4
176 ;* 0 ;通信对象设置成功 *
177 ;* 1 ;通信对象设置失败 *
178 ;* *
179 ;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3) 。 *
180 ;* 允许接收的报文,是由AMR和ACR共同决定的. *
181 ;* 满足以下条件的ID号的报文才可以被接收 *
182 ;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111 *
183 ;* 该子程序只能用于复位模式 *
- *
184 ;************************************************************************/
185 bit BCAN_SET_OBJECT(unsigned char BCAN_ACR,unsigned char BCAN_AMR)
186 {
187 1 SJA_BCANAdr=REG_ACR; //访问地址指向验收代码寄存器(ACR)
188 1 *SJA_BCANAdr=BCAN_ACR; //写入参数
189 1 if(*SJA_BCANAdr != BCAN_ACR) //校验写入值
190 1 {
191 2 return 1;
192 2 }
193 1 SJA_BCANAdr=REG_AMR; //访问地址指向验收屏蔽寄存器(AMR)
194 1 *SJA_BCANAdr=BCAN_AMR; //写入参数
195 1 if(*SJA_BCANAdr != BCAN_AMR) //校验写入值
196 1 {
197 2 return 1;
198 2 }
199 1
200 1 return 0;
201 1 }
202
203 /************************************************************************
204 ;*函数原型: bit BCAN_SET_OUTCLK (unsigned char Out_Control, *
205 unsigned char Clock_Out); *
206 ;*参数说明: *
207 * Out_Control:存放输出控制寄存器 (OC) 的参数设置 *
208 * Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置 *
209 * *
210 ;*返回值: *
211 ;* 0 ;设置成功 *
212 ;* 1 ;设置失败 *
213 ;* *
214 ;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式 *
- *
215 ;************************************************************************/
216 bit BCAN_SET_OUTCLK (unsigned char Out_Control,
217 unsigned char Clock_Out)
218 {
219 1 SJA_BCANAdr=REG_OCR ; //访问地址指向输出控制寄存器
220 1 *SJA_BCANAdr=Out_Control; //写入参数
221 1 if(*SJA_BCANAdr != Out_Control) //校验写入值
222 1 {
223 2 return 1;
224 2 }
225 1 SJA_BCANAdr=REG_CDR; //访问地址指向输出控制寄存器
226 1 *SJA_BCANAdr=Clock_Out; //写入参数
227 1 return 0;
228 1 }
229
230
231 /************************************************************************
232 *函数原型: bit BCAN_HW_INIT(unsigned char BCAN_ACR, *
233 * unsigned char BCAN_AMR, *
234 * unsigned char Bus_Timing0, *
235 * unsigned char Bus_Timing1, *
C51 COMPILER V7.20 SJA_BCANFUNC 02/23/2006 10:58:24 PAGE 5
236 * unsigned char Out_Control, *
237 * unsigned char Clock_Out *
238 * ) *
239 *参数说明: *
240 * BCAN_ACR:存放验收代码寄存器(ACR)的参数设置 *
241 * BCAN_AMR:存放接收屏蔽寄存器(AMR)的参数设置 *
242 * Bus_Timing0:存放总线定时0寄存器(BTR0)的参数设置 *
243 * Bus_Timing1:存放总线定时1寄存器(BTR1)的参数设置 *
244 * Out_Control:存放输出控制寄存器 (OC) 的参数设置 *
245 * Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置 *
246 * *
247 *返回值: *
248 * 0 ; 表示初始化成功 *
249 * 1 ; 表示初始化失败 *
250 * *
251 *说明:CAN控制器的初始化只能在复位模式下才能完成。初始化操作之前请先进入*
252 * 到复位操作模式,并将要初始化的各参数的值按数据手册中的计算方法,正 *
253 * 确的按实际需要计算好参数后,将参数写入对应的寄存器 。 *
254 *注: 为了CAN控制器的正确运行,请务必仔细的阅读SJA1000的数据手册 *
255 * *
256 *示例:设应用系统中晶体频率16MHZ,节点只接收ID(标志符)高八位为 *
257 * '10101010'的消息,系统波特率为50Kbit/s,关闭CLKOUT输出。 *
258 * 则根据数据手册中的计算方法的各参数如下: *
259 * ACR==0AAH,AMR==00H,BTR0==0C9H,BTR1==0C9H,OC==0FFH,CDR=48H *
260 * 则调用本函数为: *
261 * BCAN_HW_INIT(0xaa,0x00,0xc9,0xc9,0xff,0x48) *
262 ************************************************************************
263 bit BCAN_HW_INIT(unsigned char BCAN_ACR,
264 unsigned char BCAN_AMR,
265 unsigned char Bus_Timing0,
266 unsigned char Bus_Timing1,
267 unsigned char Out_Control,
268 unsigned char Clock_Out
269 )
270 {
271 SJA_BCANAdr=REG_ACR; //访问地址指向验收代码寄存器(ACR)
272 *SJA_BCANAdr=BCAN_ACR; //写入参数
273 if(*SJA_BCANAdr != BCAN_ACR) //校验写入值
274 {
275 return 1;
276 }
277 SJA_BCANAdr=REG_AMR; //访问地址指向验收屏蔽寄存器(AMR)
278 *SJA_BCANAdr=BCAN_AMR; //写入参数
279 if(*SJA_BCANAdr != BCAN_AMR) //校验写入值
280 {
281 return 1;
282 }
283 SJA_BCANAdr=REG_BTR0; //访问地址指向总线定时寄存器0
284 *SJA_BCANAdr=Bus_Timing0; //写入参数
285 if(*SJA_BCANAdr != Bus_Timing0)//校验写入值
286 {
287 return 1;
288 }
289 SJA_BCANAdr=REG_BTR1; //访问地址指向总线定时寄存器0
290 *SJA_BCANAdr=Bus_Timing1; //写入参数
291 if(*SJA_BCANAdr != Bus_Timing1)//校验写入值
292 {
293 return 1;
294 }
295 SJA_BCANAdr=REG_OCR ; //访问地址指向输出控制寄存器
296 *SJA_BCANAdr=Out_Control; //写入参数
297 if(*SJA_BCANAdr != Out_Control)//校验写入值
C51 COMPILER V7.20 SJA_BCANFUNC 02/23/2006 10:58:24 PAGE 6
298 {
299 return 1;
300 }
301 SJA_BCANAdr=REG_CDR; //访问地址指向输出控制寄存器
302 *SJA_BCANAdr=Clock_Out; //写入参数
303 return 0;
304 }
305
306 /************************************************************************
307 *函数原型: bit BCAN_DATA_WRITE(unsigned char *SendDataBuf)*
308 *参数说明: 特定帧各式的数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -