I2C.c
上传用户:hjhsjcl
上传日期:2020-09-25
资源大小:11378k
文件大小:10k
源码类别:

压缩解压

开发平台:

C++ Builder

  1. /*==========================================================================
  2. Copyright (c) 2004 ALi Corporation. All Rights Reserved
  3. Target File: FM
  4. Applying Source File : FmM5181.c
  5. content: 
  6. History: 
  7.  Created by David Chiu 2004/4/27
  8.  Modified by Dennis Shih 2006/01/16
  9. ==========================================================================*/
  10. #define _I2C_H_
  11. #include "TypeDef.h"
  12. #include "Const.h"
  13. #include "Reg5661.h"
  14. #if(FM_MODULE==2)
  15. #include "I2C.h"
  16. #include <intrins.h>
  17. #endif
  18. /*
  19. #include "Common.h"
  20. #include "UiFm.h"
  21. #include "I2C.h"
  22. #include "FmChipDrv.h"
  23. #if(_C_MODE_)
  24. #include "IconDefine.h"
  25. #include "OLED.h"
  26. #else
  27. #include "Lcd.h"
  28. #endif
  29. */
  30. /*--------------------------------------------------------------------------
  31. Desciption:
  32. Initial setting of I2C Module
  33. Arguments:
  34. void
  35. Global arguments:
  36. void
  37. Returns:
  38. void
  39. --------------------------------------------------------------------------*/
  40. #if(FM_MODULE==2)
  41. //////////////////////////////////////////////////////
  42. #define i2c_delay2()
  43. {
  44. _nop_();
  45. _nop_();
  46. }
  47. #define i2c_delay4()
  48. {
  49. _nop_();
  50. _nop_();
  51. }
  52. #define i2c_delay()
  53. {
  54. _nop_();
  55. _nop_();
  56. }
  57. /*
  58. void i2c_delay (void) // 400Khz, NEED TO DEBUG
  59. {
  60. // BYTE i;
  61. // for(i=0;i<1;i++)
  62. // {
  63. _nop_();
  64. _nop_();
  65. // _nop_();
  66. // }
  67. }
  68. */
  69. void i2c_start (BYTE device) i2c_large_test
  70. //void i2c_start (BYTE device)  large
  71. {
  72. #if ((_PM_FM_)|(_PM_INIT_))
  73. if (device==I2C_LCD)
  74. #endif
  75. {
  76. I2C_LCD_SDA_OUT();  
  77. I2C_LCD_SCL_OUT();
  78. I2C_LCD_SDA_1();
  79. I2C_LCD_SCL_1(); i2c_delay4();
  80. I2C_LCD_SDA_0(); i2c_delay();
  81. I2C_LCD_SCL_0(); i2c_delay();
  82. }
  83. #if ((_PM_FM_)|(_PM_INIT_))
  84. else
  85. {
  86. I2C_FM_SDA_OUT();    i2c_delay4();
  87. I2C_FM_SCL_OUT();
  88. I2C_FM_SDA_1();
  89. I2C_FM_SCL_1(); i2c_delay4();
  90. I2C_FM_SDA_0(); i2c_delay();
  91. I2C_FM_SCL_0(); i2c_delay();
  92. }
  93. #endif
  94. }
  95. void i2c_stop (BYTE device) i2c_large_test
  96. {
  97. #if ((_PM_FM_)|(_PM_INIT_))
  98. if (device==I2C_LCD)
  99. #endif
  100. {
  101. I2C_LCD_SDA_OUT();
  102. I2C_LCD_SCL_OUT();
  103. I2C_LCD_SDA_0(); i2c_delay();
  104. I2C_LCD_SCL_1(); i2c_delay4();
  105. I2C_LCD_SDA_1(); i2c_delay();
  106. I2C_LCD_SCL_0(); i2c_delay();
  107. }
  108. #if ((_PM_FM_)|(_PM_INIT_))
  109. else
  110. {
  111. I2C_FM_SDA_OUT();
  112. I2C_FM_SCL_OUT();
  113. I2C_FM_SDA_0(); i2c_delay();
  114. I2C_FM_SCL_1(); i2c_delay4();
  115. I2C_FM_SDA_1(); i2c_delay();
  116. I2C_FM_SCL_0(); i2c_delay();
  117. }
  118. #endif
  119. }
  120. #if(0)
  121. void init_i2c (BYTE device) i2c_large_test //main()初始化中调用
  122. {
  123. #if ((_PM_FM_)|(_PM_INIT_))
  124. if (device==I2C_LCD)
  125. #endif
  126. {
  127. I2C_LCD_SDA_OUT();
  128. I2C_LCD_SCL_OUT();
  129. I2C_LCD_SCL_0();
  130. }
  131. #if ((_PM_FM_)|(_PM_INIT_))
  132. else
  133. {
  134. I2C_FM_SDA_OUT();
  135. I2C_FM_SCL_OUT();
  136. I2C_FM_SCL_0();
  137. }
  138. #endif
  139. i2c_stop(device);
  140. }
  141. #endif
  142. void i2c_clock (BYTE device) i2c_large_test
  143. {
  144. // BYTE sample;
  145. #if ((_PM_FM_)|(_PM_INIT_))
  146. if (device==I2C_LCD)
  147. #endif
  148. {
  149. I2C_LCD_SCL_OUT();
  150. I2C_LCD_SCL_1(); i2c_delay4();
  151. // I2C_LCD_SDA_IN();
  152. // sample=I2C_LCD_SDA_RD;
  153. // I2C_LCD_SDA_OUT();
  154. I2C_LCD_SCL_0(); i2c_delay();
  155. }
  156. #if ((_PM_FM_)|(_PM_INIT_))
  157. else
  158. {
  159. I2C_FM_SCL_OUT();
  160. I2C_FM_SCL_1(); i2c_delay4();
  161. // I2C_FM_SDA_IN();
  162. // sample=I2C_FM_SDA_RD;
  163. // I2C_FM_SDA_OUT();
  164. I2C_FM_SCL_0(); i2c_delay();
  165. }
  166. #endif
  167. // if (sample==0) return (0);
  168. // else return (1);
  169. // return (0); 
  170. }
  171. BYTE i2c_rd_ack (BYTE device) i2c_large_test
  172. {
  173. BYTE sample;
  174. #if ((_PM_FM_)|(_PM_INIT_))
  175. if (device==I2C_LCD)
  176. #endif
  177. {
  178. I2C_LCD_SCL_OUT();
  179. I2C_LCD_SCL_1(); i2c_delay4();
  180. I2C_LCD_SDA_IN();
  181. sample=I2C_LCD_SDA_RD;
  182. I2C_LCD_SDA_OUT();
  183. I2C_LCD_SCL_0(); i2c_delay();
  184. }
  185. #if ((_PM_FM_)|(_PM_INIT_))
  186. else
  187. {
  188. I2C_FM_SCL_OUT();
  189. I2C_FM_SCL_1(); i2c_delay4();
  190. I2C_FM_SDA_IN();     i2c_delay4();
  191. sample=I2C_FM_SDA_RD; 
  192. I2C_FM_SDA_OUT();
  193. I2C_FM_SCL_0(); i2c_delay();
  194. }
  195. #endif
  196. if (sample==0) return (0);
  197. else return (1);
  198. // return (0);
  199. }
  200. BYTE i2c_rd_data (BYTE device) i2c_large_test
  201. {
  202. BYTE sample;
  203. #if ((_PM_FM_)|(_PM_INIT_))
  204. if (device==I2C_LCD)
  205. #endif
  206. {
  207. I2C_LCD_SCL_OUT();
  208. I2C_LCD_SCL_1(); i2c_delay4();
  209. // I2C_LCD_SDA_IN();
  210. sample=I2C_LCD_SDA_RD;
  211. // I2C_LCD_SDA_OUT();
  212. I2C_LCD_SCL_0(); i2c_delay();
  213. }
  214. #if ((_PM_FM_)|(_PM_INIT_))
  215. else
  216. {
  217. I2C_FM_SCL_OUT();
  218. I2C_FM_SCL_1(); i2c_delay4();
  219. // I2C_FM_SDA_IN();
  220. sample=I2C_FM_SDA_RD;  i2c_delay4();
  221. // I2C_FM_SDA_OUT();
  222. I2C_FM_SCL_0(); i2c_delay();
  223. }
  224. #endif
  225. if (sample==0) return (0);
  226. else return (1);
  227. // return (0);
  228. }
  229. BYTE i2c_send (BYTE device, BYTE i_data) i2c_large_test
  230. {
  231.  BYTE i;
  232.  for (i=0;i<8;i++)
  233.      {
  234. if (i_data&0x80) 
  235. {
  236.       #if ((_PM_FM_)|(_PM_INIT_))
  237. if (device==I2C_LCD)
  238.           #endif
  239. {I2C_LCD_SDA_1();}
  240.           #if ((_PM_FM_)|(_PM_INIT_))
  241. else
  242. {I2C_FM_SDA_1();} 
  243.           #endif
  244. }
  245. else 
  246. {
  247.       #if ((_PM_FM_)|(_PM_INIT_))
  248. if (device==I2C_LCD)
  249.       #endif
  250. {I2C_LCD_SDA_0();}
  251.       #if ((_PM_FM_)|(_PM_INIT_))
  252. else  
  253. {I2C_FM_SDA_0();} 
  254.           #endif
  255. }
  256. i_data=i_data<<1;
  257. i2c_clock(device);
  258.      }
  259.  #if ((_PM_FM_)|(_PM_INIT_))     
  260.  if (device==I2C_LCD)
  261.  #endif
  262. {I2C_LCD_SDA_1();}
  263.  #if ((_PM_FM_)|(_PM_INIT_))  
  264.  else  
  265. {I2C_FM_SDA_1();} 
  266.  #endif
  267.  #if ((_PM_FM_)|(_PM_INIT_))
  268.  if (device==I2C_LCD)
  269.  #endif
  270. {I2C_LCD_SDA_IN();}  //请求ACK
  271.  #if ((_PM_FM_)|(_PM_INIT_))   
  272.  else  
  273. {I2C_FM_SDA_IN();} 
  274.  #endif
  275.  return (!i2c_rd_ack(device));
  276. }
  277. BYTE i2c_receive (BYTE device) i2c_large_test
  278. {
  279. BYTE i,i_data=0;
  280. #if ((_PM_FM_)|(_PM_INIT_))
  281. if (device==I2C_LCD)
  282. #endif
  283. {I2C_LCD_SDA_IN();}
  284. #if ((_PM_FM_)|(_PM_INIT_))  
  285. else  
  286. {I2C_FM_SDA_IN();}
  287. #endif  
  288. for (i=0;i<8;i++)
  289.     {
  290. i_data*=2;
  291. if (i2c_rd_data(device)) i_data++;
  292.     }
  293. #if ((_PM_FM_)|(_PM_INIT_))    
  294. if (device==I2C_LCD)
  295. #endif
  296. {I2C_LCD_SDA_OUT();}
  297. #if ((_PM_FM_)|(_PM_INIT_))  
  298. else  
  299. {I2C_FM_SDA_OUT();}
  300. #endif 
  301. return(i_data);
  302. void i2c_ack (BYTE device) i2c_large_test
  303. {
  304. #if ((_PM_FM_)|(_PM_INIT_))
  305. if (device==I2C_LCD)
  306. #endif 
  307. {I2C_LCD_SDA_0();}
  308. #if ((_PM_FM_)|(_PM_INIT_))
  309. else  
  310. {I2C_FM_SDA_0();} 
  311. #endif 
  312. i2c_clock(device);
  313. #if ((_PM_FM_)|(_PM_INIT_))
  314. if (device==I2C_LCD)
  315. #endif 
  316. {I2C_LCD_SDA_1();}
  317. #if ((_PM_FM_)|(_PM_INIT_))
  318. else  
  319. {I2C_FM_SDA_1();} 
  320. #endif 
  321. }
  322. void i2c_nack (BYTE device) i2c_large_test
  323. {
  324. #if ((_PM_FM_)|(_PM_INIT_))
  325. if (device==I2C_LCD)
  326. #endif 
  327. {I2C_LCD_SDA_1();}
  328. #if ((_PM_FM_)|(_PM_INIT_))
  329. else  
  330. {I2C_FM_SDA_1();} 
  331. #endif 
  332. i2c_clock(device);
  333. #if ((_PM_FM_)|(_PM_INIT_))
  334. if (device==I2C_LCD)
  335. #endif 
  336. {I2C_LCD_SDA_0();}
  337. #if ((_PM_FM_)|(_PM_INIT_))
  338. else  
  339. {I2C_FM_SDA_0();} 
  340. #endif 
  341. }
  342. BYTE i2c_address(BYTE device, BYTE addr) i2c_large_test
  343. {
  344. i2c_start(device);
  345. if (i2c_send(device, addr))
  346. return (1);
  347. else
  348. return (0);
  349. }
  350. BYTE i2c_wr(BYTE device, BYTE sla_addr, BYTE length, BYTE * buff) i2c_large_test
  351. {
  352. BYTE i;
  353. if (i2c_address(device, sla_addr))
  354. {
  355. for (i=0;i<length;i++)
  356. {
  357. if (i2c_send(device, *buff))
  358. {
  359. buff++;
  360. // i2c_feeddog();
  361. }
  362. else
  363. {
  364. i2c_stop(device);
  365. return(0);
  366. }
  367. }
  368. i2c_stop(device);
  369. return(1);
  370. }
  371. else
  372. {
  373. i2c_stop(device);
  374. return (0);
  375. }
  376. }
  377. BYTE i2c_rd(BYTE device, BYTE sla_addr, BYTE length, BYTE * buff) i2c_large_test
  378. {
  379. BYTE i;
  380. if (i2c_address(device, sla_addr|0x01))
  381. {
  382. for(i=0;i<length;i++)
  383. {
  384. *(buff++)=i2c_receive(device);
  385. if (i==(length-1)) 
  386.    {
  387. i2c_nack(device);
  388. i2c_stop(device);
  389.    }
  390. else i2c_ack(device);
  391. // i2c_feeddog();
  392. }
  393. return(1);
  394. }
  395. else
  396. {
  397. i2c_stop(device);
  398. return (0);
  399. }
  400. }
  401. #if(0)
  402. BYTE i2c_rd1(BYTE device, BYTE sla_addr, BYTE length, BYTE * buff) i2c_large_test
  403. {
  404. BYTE i;
  405. sla_addr=12;
  406. if (i2c_address(device, sla_addr|0x01))
  407. {
  408. //for(i=0;i<length;i++)
  409. for(i=0;i<2;i++)
  410. {
  411. *(buff++)=i2c_receive(device);
  412. if (i==(length-1)) 
  413.    {
  414. i2c_nack(device);
  415. i2c_stop(device);
  416.    }
  417. else i2c_ack(device);
  418. // i2c_feeddog();
  419. }
  420. return(1);
  421. }
  422. else
  423. {
  424. i2c_stop(device);
  425. return (0);
  426. }
  427. }
  428. #endif
  429. #if (_PEDOMETER_Mode_)
  430. void I2cInit(void)
  431. {
  432. obSYSSOFTRSTCTRL2 |= 0x04; // Disable I2C soft reset
  433. obCLKI2CMCTRL = 0xD0; // Enable I2C Clock 12MHz
  434. // obCLKI2CMCTRL =0xD8; //Dennis Shih 2006/01/26
  435. // obCLKI2CMDIVF=0x00; //Dennis Shih 2006/01/26
  436. obMODSEL2 |= 0x08; // I2C Mode Select
  437. obREADYENH |= 0x08; // I2C I/O Ready
  438. }
  439. bit I2cWaitBusy(void)
  440. {
  441. #define I2C_TIME_OUT 0xFF
  442. BYTE bRetry=I2C_TIME_OUT;
  443. while(obI2CSERSTS&0x80)
  444. {
  445. // bRetry--;
  446. // if(bRetry==0)
  447. // return FALSE;
  448. }
  449. return TRUE;
  450. }
  451. #endif 
  452. #else //#if(FM_MODULE==2)
  453. #if (_PM_FM_|_PM_MPTEST_|_PEDOMETER_Mode_)
  454. void I2cInit(void)
  455. {
  456. obSYSSOFTRSTCTRL2 |= 0x04; // Disable I2C soft reset
  457. obCLKI2CMCTRL = 0xD0; // Enable I2C Clock 12MHz
  458. // obCLKI2CMCTRL =0xD8; //Dennis Shih 2006/01/26
  459. // obCLKI2CMDIVF=0x00; //Dennis Shih 2006/01/26
  460. obMODSEL2 |= 0x08; // I2C Mode Select
  461. obREADYENH |= 0x08; // I2C I/O Ready
  462. }
  463. #endif //(_PM_FM_|_PM_MPTEST_)
  464. #if (_PM_FM_|_PM_MPTEST_|_PEDOMETER_Mode_)
  465. bit I2cWaitBusy(void)
  466. {
  467. #define I2C_TIME_OUT 0xFF
  468. BYTE bRetry=I2C_TIME_OUT;
  469. while(obI2CSERSTS&0x80)
  470. {
  471. // bRetry--;
  472. // if(bRetry==0)
  473. // return FALSE;
  474. }
  475. return TRUE;
  476. }
  477. #endif //(_PM_FM_|_PM_MPTEST_)
  478. #endif