Test_MCP2510.c
上传用户:jankzhpno
上传日期:2022-08-03
资源大小:4763k
文件大小:21k
源码类别:

Windows CE

开发平台:

Visual C++

  1. /****************************************************************************
  2. 【文  件  名  称】Test_MCP2510.C
  3. 【功  能  描  述】三星S3C2410A板demo程序代码
  4. 【程  序  版  本】4.0
  5. 【创建人及创建日期】龚俊( gongjun98@sohu.com )//2002年11月19日19:26
  6. 【修改人及修改日期】龚俊( gongjun98@sohu.com )//2004-12-8 17:25
  7. ****************************************************************************/
  8. //***************************************************************************
  9. #include "def.h"
  10. #include "option.h"
  11. #include "2440addr.h"
  12. #include "2440lib.h"
  13. #include "2440slib.h" 
  14. #include "MCP2510.h"
  15. /****************************************************************************
  16. MCP2510_CS GPG2 output ( nSS0 )
  17. MCP2510_SI GPE12 output ( SPIMOSI0 )
  18. MCP2510_SO GPE11 input ( SPIMISO0 )
  19. MCP2510_SCK GPE13 output ( SPICLK0 )
  20. MCP2510_INT GPG0 input ( EINT8 )
  21. ****************************************************************************/
  22. #define MCP2510_DEBUG    1
  23. #define DELAY_TIME 500
  24. #define MCP2510_CS_OUT ( rGPGCON = rGPGCON & (~(3<<4)) | (1<<4) ) //GPG2
  25. #define MCP2510_CS_H ( rGPGDAT = rGPGDAT | (1<<2) )
  26. #define MCP2510_CS_L ( rGPGDAT = rGPGDAT & (~(1<<2))  )
  27. #define MCP2510_SI_OUT ( rGPECON = rGPECON & (~(3<<24)) | (1<<24) ) //GPE12
  28. #define MCP2510_SI_H ( rGPEDAT = rGPEDAT | (1<<12) )
  29. #define MCP2510_SI_L ( rGPEDAT = rGPEDAT & (~(1<<12)) )
  30. #define MCP2510_SCK_OUT ( rGPECON = rGPECON & (~(3<<26)) | (1<<26) ) //GPE13
  31. #define MCP2510_SCK_H ( rGPEDAT = rGPEDAT | (1<<13) )
  32. #define MCP2510_SCK_L ( rGPEDAT = rGPEDAT & (~(1<<13)) )
  33. #define MCP2510_SO_IN ( rGPECON = rGPECON & (~(3<<22)) | (0<<22) ) //GPE11
  34. #define MCP2510_SO_GET ( rGPEDAT & (1<<11) )
  35. #define MCP2510_SO_PULLUP ( rGPEUP = rGPEUP & (~(1<<11)) )
  36. #define MCP2510_SO_DISPULLUP ( rGPEUP = rGPEUP | (1<<11) )
  37. #define MCP2510_INT_IN ( rGPGCON = rGPGCON & (~(3<<0)) ) //GPG0
  38. #define MCP2510_INT_GET ( rGPGDAT & 0x01 )
  39. /********************** MCP2510 Instruction *********************************/
  40. #define MCP2510INSTR_RESET 0xc0 //复位为缺省状态,并设定为配置模式
  41. #define MCP2510INSTR_READ 0x03 //从寄存器中读出数据
  42. #define MCP2510INSTR_WRITE 0x02 //向寄存器写入数据
  43. #define MCP2510INSTR_RTS 0x80 //启动一个或多个发送缓冲器的报文发送
  44. #define MCP2510INSTR_RDSTAT 0xa0 //读取状态
  45. #define MCP2510INSTR_BITMDFY 0x05 //位修改
  46. //***************************************************************************
  47. /****************************************************************************
  48. 【功能说明】SPI接口IO片选初始化
  49. ****************************************************************************/
  50. void MCP2510_IO_CS_Init( void ) 
  51. {
  52.    MCP2510_CS_OUT ;
  53.    MCP2510_SI_OUT ;
  54.    MCP2510_SCK_OUT ;
  55.    MCP2510_SO_IN ;
  56.    MCP2510_SO_PULLUP ; //允许上拉
  57.    //MCP2510_SO_DISPULLUP ; //禁止上拉
  58.    MCP2510_SI_L ; //SI put 0
  59.    MCP2510_SCK_L ; //SCK put 0
  60.    { U16 k=0; for( ; k <= DELAY_TIME; k++ ) ;  }  //延时至少300ns
  61.    MCP2510_CS_H ; // unselect the MCP2510
  62.    { U16 k=0; for( ; k <= DELAY_TIME; k++ ) ;  }  //延时至少300ns
  63. }
  64. /****************************************************************************
  65. 【功能说明】SPI接口读写开始,片选有效
  66. ****************************************************************************/
  67. void MCP2510_RW_Start( void ) 
  68. {
  69.    MCP2510_SI_L ; //SI put 0
  70.    MCP2510_SCK_L ; //SCK put 0
  71.    { U16 k=0; for( ; k <= DELAY_TIME; k++ ) ;  }  //延时至少300ns
  72.    MCP2510_CS_L ; // Select the MCP2510
  73.    { U16 k=0; for( ; k <= DELAY_TIME; k++ ) ;  }  //延时至少300ns
  74. }
  75. /****************************************************************************
  76. 【功能说明】SPI接口写入数据
  77. ****************************************************************************/
  78. void Spi_Write( U8 Data ) 
  79. {
  80. U8 m ;
  81. for( m = 0; m < 8; m++ )
  82. {
  83. if( (Data&0x80)==0x80 )
  84. MCP2510_SI_H; //SI put 1
  85. else
  86. MCP2510_SI_L; //SI put 0
  87. { U16 k=0; for( ; k <= DELAY_TIME; k++ ) ;  }  //延时至少300ns
  88. MCP2510_SCK_H ; //SCK put 1
  89. Data = Data<<1 ;
  90. MCP2510_SCK_L ; //SCK put 0
  91. { U16 k=0; for( ; k <= DELAY_TIME; k++ ) ;  }  //延时至少300ns
  92. }
  93. }
  94. /****************************************************************************
  95. 【功能说明】SPI接口读出数据
  96. ****************************************************************************/
  97. U8 Spi_Read( )
  98. {
  99. U8 m ;
  100. U8 data = 0 ;
  101. for( m = 0; m < 8; m++ )
  102. {
  103. MCP2510_SCK_H ; //SCK put 1
  104. { U16 k=0; for( ; k <= DELAY_TIME; k++ ) ;  }  //延时至少300ns
  105. data = data<<1;
  106. if( MCP2510_SO_GET != 0 )
  107. data |= 0x01 ;
  108. else
  109. data &= 0xfe;
  110. { U16 k=0; for( ; k <= DELAY_TIME; k++ ) ;  }  //延时至少300ns
  111. MCP2510_SCK_L ; //SCK put 0
  112. { U16 k=0; for( ; k <= DELAY_TIME; k++ ) ;  }  //延时至少300ns
  113. }
  114. return (data);
  115. }
  116. /****************************************************************************
  117. 【功能说明】 Send Command to MCP2510 via SPI 
  118. ****************************************************************************/
  119. void SendCMDMCP2510( U8 CMD )
  120. {
  121.    MCP2510_RW_Start() ; //Initial IO port and CS is select
  122.    Spi_Write( CMD );
  123.    MCP2510_CS_H ; // Deselect the MCP2510
  124. }
  125. /****************************************************************************
  126. 【功能说明】软件复位MCP2510
  127. ****************************************************************************/
  128. void MCP2510_Reset()
  129. {
  130. MCP2510_RW_Start() ;
  131. Spi_Write( MCP2510INSTR_RESET );
  132. MCP2510_CS_H ;
  133. }
  134. /****************************************************************************
  135. 【功能说明】向MCP2510指定地址写入一个字节
  136. ****************************************************************************/
  137. void MCP2510_Write( U8 address, U8 value)
  138. {
  139. MCP2510_RW_Start() ;
  140. Spi_Write(MCP2510INSTR_WRITE);
  141. Spi_Write( address );
  142. Spi_Write( value );
  143. MCP2510_CS_H ;
  144. }
  145. /****************************************************************************
  146. 【功能说明】修改指定地址寄存器的某些位
  147. ****************************************************************************/
  148. void MCP2510_WriteBits( U8 address, U8 data, U8 mask )
  149. {
  150. MCP2510_RW_Start() ;
  151. Spi_Write( MCP2510INSTR_BITMDFY );
  152. Spi_Write( address);
  153. Spi_Write( mask);
  154. Spi_Write( data);
  155. MCP2510_CS_H ;
  156. }
  157. /****************************************************************************
  158. 【功能说明】              Read often used status
  159. //Status   7     6     5     4     3     2   1 0
  160. // | | | | | | | |
  161. // | | | | | | | |___CANINTF.RX0IF
  162. // | | | | | | |_______CANINTF.RX1IF
  163. // | | | | | |___________TXB0CTRL.TXREQ
  164. // | | | | |_______________CANINTF.TX0IF
  165. // | | | |___________________TXB1CTRL.TXREQ
  166. // | | |_______________________CANINTF.TX1IF
  167. // | |___________________________TXB2CTRL.TXREQ
  168. // |_______________________________CANINTF.TX2IF
  169. ****************************************************************************/
  170. unsigned char MCP2510_ReadStatus()
  171. {
  172. unsigned char result;
  173. MCP2510_RW_Start() ;
  174. Spi_Write(MCP2510INSTR_RDSTAT);
  175. result = Spi_Read() ;
  176. Spi_Write( 0 ) ; //数据重复输出
  177. MCP2510_CS_H ;
  178. //if( MCP2510_DEBUG ) Uart_Printf( "StatusREG = 0x%xn", result ) ;
  179. return result;
  180. }
  181. /****************************************************************************
  182. 【功能说明】从MCP2510指定地址中读出一个字节
  183. ****************************************************************************/
  184. unsigned char MCP2510_Read( U8 address )
  185. {
  186. unsigned char result;
  187. MCP2510_RW_Start() ;
  188. Spi_Write(MCP2510INSTR_READ) ; //0x03
  189. Spi_Write( address ) ;
  190. result = Spi_Read() ;
  191. MCP2510_CS_H ;
  192. return result ;
  193. }
  194. /****************************************************************************
  195. 【功能说明】序列读取MCP2510数据
  196. ****************************************************************************/
  197. void MCP2510_SRead( U8 address, unsigned char* pdata, U8 nlength )
  198. {
  199. int i;
  200. MCP2510_RW_Start() ;
  201. Spi_Write(MCP2510INSTR_READ);
  202. Spi_Write( address );
  203. for (i=0; i<nlength; i++)
  204. {
  205. *pdata=Spi_Read();
  206. //if( MCP2510_DEBUG )    Uart_Printf( "  0x%xn", (unsigned char)*pdata ) ;
  207. pdata++;
  208. }
  209. MCP2510_CS_H ;
  210. }
  211. /****************************************************************************
  212. 【功能说明】序列写入MCP2510数据
  213. ****************************************************************************/
  214. void MCP2510_Swrite( U8 address, unsigned char* pdata, U8 nlength)
  215. {
  216. int i;
  217. MCP2510_RW_Start() ;
  218. Spi_Write(MCP2510INSTR_WRITE);
  219. Spi_Write((unsigned char)address);
  220. for (i=0; i < nlength; i++) 
  221. {
  222. Spi_Write( (unsigned char)*pdata );
  223. //if( MCP2510_DEBUG )    Uart_Printf( "0x%xn", (unsigned char)*pdata ) ;
  224. pdata++;
  225. }
  226. MCP2510_CS_H ;
  227. }
  228. /****************************************************************************
  229. 【功能说明】
  230. ****************************************************************************/
  231. void MCP2510_SetBandRate(CanBandRate bandrate, int IsBackNormal)
  232. {
  233. U8 value=0;
  234. U8 ReadBackCNT = 0;
  235. // Bit rate calculations.
  236. //
  237. //Input clock fre=16MHz
  238. // In this case, we'll use a speed of 125 kbit/s, 250 kbit/s, 500 kbit/s.
  239. // If we set the length of the propagation segment to 7 bit time quanta,
  240. // and we set both the phase segments to 4 quanta each,
  241. // one bit will be 1+7+4+4 = 16 quanta in length.
  242. //
  243. // setting the prescaler (BRP) to 0 => 500 kbit/s.
  244. // setting the prescaler (BRP) to 1 => 250 kbit/s.
  245. // setting the prescaler (BRP) to 3 => 125 kbit/s.
  246. //
  247. // If we set the length of the propagation segment to 3 bit time quanta,
  248. // and we set both the phase segments to 1 quanta each,
  249. // one bit will be 1+3+2+2 = 8 quanta in length.
  250. // setting the prescaler (BRP) to 0 => 1 Mbit/s.
  251. // Go into configuration mode
  252. MCP2510_Write(MCP2510REG_CANCTRL, MODE_CONFIG);
  253. if( MCP2510_DEBUG )  Uart_Printf( "MCP2510REG_CANCTRL =  0x%xn", MCP2510_Read(MCP2510REG_CANCTRL) );
  254. while( ReadBackCNT<8 )
  255. {
  256. value = ( MCP2510_Read( MCP2510REG_CANSTAT ) & 0xe0 );
  257. if(value == MODE_CONFIG ){
  258. //Uart_Printf( "ReadBackCNT = 0x%xn", ReadBackCNT );
  259. break;
  260. }
  261. ReadBackCNT++ ;
  262. }
  263. if( ReadBackCNT == 8 )  //Set mcp2510's mode failed,redo it again
  264. {
  265. Uart_Printf( "Set config mode is failed! CANCTRL = 0x%xn", value );
  266. MCP2510_Reset();
  267. MCP2510_Write(MCP2510REG_CANCTRL, MODE_CONFIG); //redo to set mcp2510 mode
  268. Delay( 150 );
  269. value = ( MCP2510_Read(MCP2510REG_CANCTRL) & 0xe0 ); //read back mode from CANSTAT Register
  270. Uart_Printf( "Set is 0x%x , Read is 0x%xn", MODE_CONFIG, value ) ;
  271. }
  272. switch(bandrate){
  273. case BandRate_10kbps:
  274. MCP2510_Write(CNF1, 0x31); //10k 16TQ
  275. MCP2510_Write(CNF2, 0xb0);  //PS1=7 TQ  PSeg=1 TQ
  276. MCP2510_Write(CNF3, 0x06);  //PS2=7 TQ SYNC=1 TQ
  277. //if( MCP2510_DEBUG )  Uart_Printf( "CNF1 =  0x%xn", MCP2510_Read(CNF1) );
  278. //if( MCP2510_DEBUG )  Uart_Printf( "CNF2 =  0x%xn", MCP2510_Read(CNF2) );
  279. //if( MCP2510_DEBUG )  Uart_Printf( "CNF3 =  0x%xn", MCP2510_Read(CNF3) );
  280. break;
  281. case BandRate_125kbps:
  282. MCP2510_Write(CNF1, SJW1|BRP4); //Synchronization Jump Width Length =1 TQ
  283. MCP2510_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1 = 4, Prop Seg = 7
  284. MCP2510_Write(CNF3, SEG4);// Phase Seg 2 = 4
  285. break;
  286. case BandRate_250kbps:
  287. MCP2510_Write(CNF1, SJW1|BRP2); //Synchronization Jump Width Length =1 TQ
  288. MCP2510_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1 = 4, Prop Seg = 7
  289. MCP2510_Write(CNF3, SEG4);// Phase Seg 2 = 4
  290. break;
  291. case BandRate_500kbps:
  292. MCP2510_Write(CNF1, SJW1|BRP1); //Synchronization Jump Width Length =1 TQ
  293. MCP2510_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1 = 4, Prop Seg = 7
  294. MCP2510_Write(CNF3, SEG4);// Phase Seg 2 = 4
  295. break;
  296. case BandRate_1Mbps:
  297. MCP2510_Write(CNF1, SJW1|BRP1); //Synchronization Jump Width Length =1 TQ
  298. MCP2510_Write(CNF2, BTLMODE_CNF3|(SEG3<<3)|SEG2); // Phase Seg 1 = 2, Prop Seg = 3
  299. MCP2510_Write(CNF3, SEG2);// Phase Seg 2 = 1
  300. break;
  301. }
  302. if( IsBackNormal == TRUE  )
  303. {
  304. //Enable clock output
  305. MCP2510_Write(CLKCTRL, MODE_NORMAL | CLKEN | CLK8);
  306. }
  307. }
  308. /****************************************************************************
  309. 【功能说明】读取MCP2510 CAN总线ID
  310. 参数: address为MCP2510寄存器地址
  311. can_id为返回的ID值
  312. 返回值
  313. TRUE,表示是扩展ID(29位)
  314. FALSE,表示非扩展ID(11位)
  315. ****************************************************************************/
  316. int MCP2510_Read_Can_ID( U8 address, U32* can_id)
  317. {
  318. U32 tbufdata;
  319. unsigned char* p=(unsigned char*)&tbufdata;
  320. MCP2510_SRead(address, p, 4);
  321. *can_id = (tbufdata<<3)|((tbufdata>>13)&0x7);
  322. *can_id &= 0x7ff;
  323. if ( (p[MCP2510LREG_SIDL] & TXB_EXIDE_M) ==  TXB_EXIDE_M ) {
  324. *can_id = (*can_id<<2) | (p[MCP2510LREG_SIDL] & 0x03);
  325. *can_id <<= 16;
  326. *can_id |= tbufdata>>16;
  327. return TRUE;
  328. }
  329. return FALSE;
  330. }
  331. /***********************************************************
  332. * 读取MCP2510 接收的数据 *
  333. * 参数: nbuffer为第几个缓冲区可以为3或者4 *
  334. * can_id为返回的ID值 *
  335. * rxRTR表示是否是RXRTR *
  336. * data表示读取的数据 *
  337. * dlc表示data length code *
  338. * 返回值 *
  339. * TRUE,表示是扩展总线 *
  340. * FALSE,表示非扩展总线 *
  341. ***********************************************************/
  342. int MCP2510_Read_Can(U8 nbuffer, int* rxRTR, U32* can_id, U8* data , U8* dlc)
  343. {
  344. U8 mcp_addr = (nbuffer<<4) + 0x31, ctrl;
  345. int IsExt;
  346. IsExt=MCP2510_Read_Can_ID( mcp_addr, can_id);
  347. ctrl=MCP2510_Read(mcp_addr-1);
  348. *dlc=MCP2510_Read( mcp_addr+4);
  349. if ((ctrl & 0x08)) {
  350. *rxRTR = TRUE;
  351. }
  352. else{
  353. *rxRTR = FALSE;
  354. }
  355. *dlc &= DLC_MASK;
  356. //MCP2510_SRead(mcp_addr+5, data, *dlc);
  357. MCP2510_SRead(mcp_addr+5, data, 8);
  358. return IsExt;
  359. }
  360. /***********************************************************
  361. * 写入MCP2510 发送的数据 *
  362. * 参数: nbuffer为第几个缓冲区可以为0、1、2 *
  363. * ext表示是否是扩展总线 *
  364. * can_id为返回的ID值 *
  365. * rxRTR表示是否是RXRTR *
  366. * data表示读取的数据 *
  367. * dlc表示data length code *
  368. * FALSE,表示非扩展总线 *
  369. ***********************************************************/
  370. void MCP2510_Write_Can( U8 nbuffer, int ext, U32 can_id, int rxRTR, U8* data,U8 dlc )
  371. {
  372. U8 mcp_addr = (nbuffer<<4) + 0x31;
  373. MCP2510_Swrite(mcp_addr+5, data, dlc );  // write data bytes
  374. MCP2510_Write_Can_ID( mcp_addr, can_id,ext);  // write CAN id
  375. if (rxRTR)
  376. dlc |= RTR_MASK;  // if RTR set bit in byte
  377. MCP2510_Write((mcp_addr+4), dlc);            // write the RTR and DLC
  378. }
  379. /*******************************************
  380. * 设置MCP2510 CAN总线ID *
  381. * 参数: address为MCP2510寄存器地址*
  382. * can_id为设置的ID值 *
  383. * IsExt表示是否为扩展ID *
  384. *******************************************/
  385. void MCP2510_Write_Can_ID(U8 address, U32 can_id, int IsExt)
  386. {
  387. U32 tbufdata;
  388. if (IsExt) {
  389. can_id&=0x1fffffff; //29位
  390. tbufdata=can_id &0xffff;
  391. tbufdata<<=16;
  392. tbufdata|=(can_id>>(18-5)&(~0x1f));
  393. tbufdata |= TXB_EXIDE_M;
  394. }
  395. else{
  396. can_id&=0x7ff; //11位
  397. tbufdata= (can_id>>3)|((can_id&0x7)<<13);
  398. }
  399. MCP2510_Swrite(address, (unsigned char*)&tbufdata, 4);
  400. }
  401. /***********************************************************************************
  402. 发送数据
  403. 参数:
  404. data,发送数据
  405. Note: 使用三个缓冲区循环发送,没有做缓冲区有效检测
  406. ***********************************************************************************/
  407. void Can_Write(U32 id, U8 *pdata, unsigned char dlc, int IsExt, int rxRTR)
  408. {
  409. unsigned char err ;
  410. static int ntxbuffer=0;
  411. MCP2510_Write_Can(ntxbuffer, IsExt, id, rxRTR, pdata, dlc);
  412. switch(ntxbuffer){
  413. case 0:
  414. MCP2510_WriteBits(TXB0CTRL, (TXB_TXREQ_M|TXB_TXP10_M), 0xff) ;
  415. do { err = MCP2510_Read(TXB0CTRL) ; }
  416. while( (err &0x08)==0x08 )  ;
  417. if( (err &0x70) != 0 )  Uart_Printf( "  Can Send Err = 0x%xn", err  );
  418. ntxbuffer=1;
  419. break;
  420. case 1:
  421. MCP2510_WriteBits(TXB1CTRL, (TXB_TXREQ_M|TXB_TXP10_M), 0xff) ;
  422. do { err = MCP2510_Read(TXB1CTRL) ; }
  423. while( (err &0x08)==0x08 )  ;
  424. if( (err &0x70) != 0 )  Uart_Printf( "  Can Send Err = 0x%xn", err  );
  425. ntxbuffer=2;
  426. break;
  427. case 2:
  428. MCP2510_WriteBits(TXB2CTRL, (TXB_TXREQ_M|TXB_TXP10_M), 0xff) ;
  429. do { err = MCP2510_Read(TXB2CTRL) ; }
  430. while( (err &0x08)==0x08 )  ;
  431. if( (err &0x70) != 0 )  Uart_Printf( "  Can Send Err = 0x%xn", err  );
  432. ntxbuffer=0;
  433. break;
  434. }
  435. }
  436. /***********************************************************************************
  437. 查询是否收到数据
  438. 返回值:如果没有数据,则返回-1,
  439. 否则,返回收到数据的缓冲区号
  440. Note: 如果两个缓冲区都收到数据,则返回第一个缓冲区
  441. ***********************************************************************************/
  442. int Can_Poll()
  443. {
  444. if( MCP2510_ReadStatus()&RX0INT )
  445. return 0;
  446. if( MCP2510_ReadStatus()&RX1INT )
  447. return 1;
  448. return -1;
  449. }
  450. /****************************************************************************
  451. 【功能说明】
  452. ****************************************************************************/
  453. int Can_Read(int n, U32* id, U8 *pdata,  U8*dlc, int* rxRTR, int *isExt)
  454. {
  455. U8 byte;
  456. byte = MCP2510_Read(CANINTF);
  457. if(n==0)
  458. {
  459. if(byte & RX0INT)
  460. {
  461. *isExt=MCP2510_Read_Can(n+3, rxRTR, id, pdata, dlc);
  462. MCP2510_WriteBits(CANINTF, (U8)(~(RX0INT)), RX0INT); // Clear interrupt
  463. return TRUE ;
  464. }
  465. Uart_Printf( "Error! 0 bytes is Read!!! CANINTF=0x%xn", byte ) ;
  466. return FALSE;
  467. }
  468. else if(n ==1 )
  469. {
  470. if(byte & RX1INT)
  471. {
  472. *isExt=MCP2510_Read_Can(n+4, rxRTR, id, pdata, dlc);
  473. MCP2510_WriteBits(CANINTF, (U8)(~(RX1INT)), RX1INT); // Clear interrupt
  474. return TRUE ;
  475. }
  476. Uart_Printf( "0 bytes is Read!!! CANINTF=0x%xn", byte ) ;
  477. return FALSE;
  478. }
  479. Uart_Printf( "Error! Receive channel=0x%xn", n ) ;
  480. return FALSE;
  481. }
  482. /****************************************************************************
  483. 【功能说明】
  484. ****************************************************************************/
  485. // Setup the CAN buffers used by the application.
  486. // We currently use only one for reception and one for transmission.
  487. // It is possible to use several to get a simple form of queue.
  488. //
  489. // We setup the unit to receive all CAN messages.
  490. // As we only have at most 4 different messages to receive, we could use the
  491. // filters to select them for us.
  492. //
  493. // Init_MCP2510() should already have been called.
  494. void Can_Setup(void)
  495. {
  496.     // As no filters are active, all messages will be stored in RXB0 only if
  497.     // no roll-over is active. We want to recieve all CAN messages (standard and extended)
  498.     // (RXM<1:0> = 11).
  499.     //SPI_mcp_write_bits(RXB0CTRL, RXB_RX_ANY, 0xFF);
  500.     //SPI_mcp_write_bits(RXB1CTRL, RXB_RX_ANY, 0xFF);
  501.     // But there is a bug in the chip, so we have to activate roll-over.
  502. MCP2510_WriteBits(RXB0CTRL, (RXB_BUKT+RXB_RX_ANY), 0xFF); //关闭屏蔽滤波功能,接收所有报文,允许滚存 
  503. MCP2510_WriteBits(RXB1CTRL, RXB_RX_ANY, 0xFF); //关闭屏蔽滤波功能,接收所有报文
  504. }
  505. /****************************************************************************
  506. 【功能说明】
  507. ****************************************************************************/
  508. void Init_MCP2510(CanBandRate bandrate)
  509. {
  510. unsigned char i,j,a;
  511. MCP2510_IO_CS_Init() ;
  512. MCP2510_Reset();
  513. MCP2510_SetBandRate(bandrate,FALSE); //设置波特率
  514. // Disable interrups.
  515. MCP2510_Write(CANINTE, NO_IE);   //禁止所有中断
  516. // Mark all filter bits as don't care:
  517. MCP2510_Write_Can_ID(RXM0SIDH, 0,0);
  518. MCP2510_Write_Can_ID(RXM1SIDH, 0,0);
  519. // Anyway, set all filters to 0:
  520. MCP2510_Write_Can_ID(RXF0SIDH, 0, 0);
  521. MCP2510_Write_Can_ID(RXF1SIDH, 0, 0);
  522. MCP2510_Write_Can_ID(RXF2SIDH, 0, 0);
  523. MCP2510_Write_Can_ID(RXF3SIDH, 0, 0);
  524. MCP2510_Write_Can_ID(RXF4SIDH, 0, 0);
  525. MCP2510_Write_Can_ID(RXF5SIDH, 0, 0);
  526. MCP2510_Write(CLKCTRL, MODE_LOOPBACK| CLKEN | CLK8);//回环模式
  527.     //如果不能用两台设备联机实验的话,可以选择回环模式
  528. //MCP2510_Write(CLKCTRL, MODE_NORMAL| CLKEN | CLK8);//标准模式
  529.   
  530. // Clear, deactivate the three transmit buffers
  531. a = TXB0CTRL;
  532. for (i = 0; i < 3; i++) {
  533. for (j = 0; j < 14; j++) {
  534. MCP2510_Write(a, 0);
  535. a++;
  536.         }
  537.         a += 2; // We did not clear CANSTAT or CANCTRL
  538. }
  539. // and the two receive buffers.
  540. MCP2510_Write(RXB0CTRL, 0);
  541. MCP2510_Write(RXB1CTRL, 0);
  542. // The two pins RX0BF and RX1BF are used to control two LEDs; set them as outputs and set them as 00.
  543. MCP2510_Write(BFPCTRL, 0x3C);
  544. //Open Interrupt
  545. MCP2510_Write(CANINTE, RX0IE|RX1IE);
  546. }
  547. /****************************************************************************
  548. 【功能说明】MCP2510实验程序
  549. ****************************************************************************/
  550. void Test_MCP2510(void)
  551. {
  552. int i;
  553. U32 id;
  554. unsigned char dlc;
  555. int rxRTR, isExt;
  556. int temp;
  557. U8 data_write[8]={1,2,3,4,5,6,7,8};
  558. U8 data_read[8] ;
  559.     Uart_Printf( "nCAN BUS Test[ MCP2510 ], press ESC key to exit !n" ) ;
  560. Init_MCP2510(BandRate_10kbps);
  561. Can_Setup();
  562.     while( Uart_GetKey() != ESC_KEY )
  563.     {
  564. Can_Write( 0x5a5, data_write, 8, FALSE, FALSE);
  565. while( (i=Can_Poll())==-1 ) ;
  566. for( temp=0; temp<8; temp++)  data_read[temp] = 0 ;
  567. temp = Can_Read(i, &id, data_read, &dlc, &rxRTR, &isExt);
  568. Uart_Printf( "  ID=0x%xn",id );
  569. Uart_Printf( "Data=%x,%x,%x,%x,%x,%x,%x,%xn",data_read[0],data_read[1],data_read[2],data_read[3],data_read[4],data_read[5],data_read[6],data_read[7] );
  570. /*
  571. for( temp=0; temp<8; temp++)  data_read[temp] = 0 ;
  572. temp = Can_Read(1, &id, data_read, &dlc, &rxRTR, &isExt);
  573. Uart_Printf( "  ID=0x%xn",id );
  574. Uart_Printf( "Data=%x,%x,%x,%x,%x,%x,%x,%xn",data_read[0],data_read[1],data_read[2],data_read[3],data_read[4],data_read[5],data_read[6],data_read[7] );
  575. */
  576. Delay(500);
  577. }
  578. }