GPIO_IIC_Drv.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. #include "GPIO_IIC_Drv.h"
  2. unsigned char IIC_ack; /*应答标志位*/
  3. //PB11:SDA
  4. //PB10:SDL
  5. #define IIC_SDA_3V3_STATE GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)
  6. #define IIC_SDA_3V3(v) ((v == 0) ? (GPIO_ResetBits(GPIOB, GPIO_Pin_0)) : (GPIO_SetBits(GPIOB, GPIO_Pin_0)) )
  7. #define IIC_SDA_Chg_in() SDA_Port_Config(0)
  8. #define IIC_SDA_Chg_out() SDA_Port_Config(1)
  9. #define IIC_SCL_3V3(v) ((v == 0) ? (GPIO_ResetBits(GPIOC, GPIO_Pin_5)) : (GPIO_SetBits(GPIOC, GPIO_Pin_5)) )
  10. /*********************延时函数xus***********************************/
  11. #define IIC_Delay1us() IIC_Delayus(1)
  12. void IIC_Delayus(unsigned short Times)
  13. {
  14. unsigned short i=0;
  15. while(Times--)
  16. {
  17. i=10; //自己定义
  18. while(i--) ;
  19. }
  20. }
  21. /******************************************************************/
  22. void SDA_Port_Config(unsigned char mode)
  23. {
  24. GPIO_InitTypeDef GPIO_InitStructure;
  25. if (mode==1) //输出模式
  26. {
  27. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  28. }
  29. else
  30. {
  31. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  32. }
  33. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  34. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  35. GPIO_Init(GPIOB,&GPIO_InitStructure);
  36. }
  37. void IIC_SDA_HIGH(void)
  38. {
  39. IIC_SDA_Chg_out();
  40. IIC_SDA_3V3(1);
  41. }
  42. void IIC_SDA_LOW(void)
  43. {
  44. IIC_SDA_Chg_out();
  45. IIC_SDA_3V3(0);
  46. }
  47. void IIC_SCL_HIGH(void)
  48. {
  49. IIC_SCL_3V3(1);
  50. }
  51. void IIC_SCL_LOW(void)
  52. {
  53. IIC_SCL_3V3(0);
  54. }
  55. int GPIO_IIC_init(void)
  56. {
  57. GPIO_InitTypeDef GPIO_InitStructure;
  58. //打开相应GPIO口的时钟
  59. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC,ENABLE);
  60. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  61. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  62. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  63. GPIO_Init(GPIOB,&GPIO_InitStructure);
  64. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  65. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  66. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  67. GPIO_Init(GPIOC,&GPIO_InitStructure);
  68. //=========================================================
  69. //GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);
  70. //GPIO_ResetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);
  71. return 1;
  72. }
  73. void IIC_init(void)
  74. {
  75. GPIO_IIC_init();
  76. IIC_SCL_HIGH();
  77. IIC_SDA_HIGH();
  78. //IIC_SDA_Chg_in();
  79. }
  80. void IIC_Start(void)
  81. {
  82. /*发送起始条件的数据信号*/
  83. IIC_SDA_Chg_out();
  84. IIC_SCL_HIGH();
  85. IIC_Delayus(10);
  86. IIC_SDA_HIGH();
  87. IIC_Delayus(30); //5/*起始条件建立时间大于4.7us,延时*/
  88. /*发送起始信号*/
  89. IIC_SDA_LOW();
  90. IIC_Delayus(30); //5/* 起始条件锁定时间大于4μs*/
  91. /*钳住I2C总线,准备发送或接收数据 */
  92. IIC_SCL_LOW();
  93. // IIC_Delayus(30); //5//delay10us();
  94. // IIC_SDA_Chg_in(); //输入
  95. }
  96. void IIC_Stop(void)
  97. {
  98. /*发送结束条件的数据信号*/
  99. IIC_SDA_Chg_out();
  100. // IIC_SCL_LOW();
  101. // IIC_Delayus(30);
  102. IIC_SDA_LOW();
  103. IIC_Delayus(10); /*发送结束条件的时钟信号*/
  104. IIC_SCL_HIGH();
  105. IIC_Delayus(10); //5//delay25us();
  106. IIC_SDA_HIGH();
  107. IIC_Delayus(10); //5//delay25us();
  108. /*发送I2C总线结束信号*/
  109. }
  110. void IIC_Free(void)
  111. {
  112. /*发送结束条件的数据信号*/
  113. IIC_SDA_Chg_out();
  114. IIC_SDA_HIGH();
  115. IIC_Delayus(30); //5//delay25us();
  116. IIC_SCL_HIGH();
  117. IIC_Delayus(30); //5//delay25us();
  118. /*发送I2C总线结束信号*/
  119. }
  120. /*
  121. * FunctionName: I2CSendACK
  122. * Purpose: 模拟I2C发送ACK响应
  123. * Parameters: 无
  124. */
  125. void IIC_SendAck(void)
  126. {
  127. IIC_SDA_Chg_out();
  128. IIC_SCL_LOW();
  129. IIC_Delayus(10); //5//delay25us();
  130. IIC_SDA_LOW();
  131. IIC_Delayus(10); //5//delay25us();
  132. IIC_SCL_HIGH();
  133. IIC_Delayus(10); //5//delay25us();
  134. IIC_SCL_LOW();
  135. IIC_Delayus(10); //5//delay25us();
  136. }
  137. /*
  138. * FunctionName: I2CSendACK
  139. * Purpose: 模拟I2C无ACK响应
  140. * Parameters: 无
  141. */
  142. void IIC_SendNoAck(void)
  143. {
  144. IIC_SDA_Chg_out();
  145. IIC_SCL_LOW();
  146. IIC_Delayus(10); //5//delay25us();
  147. IIC_SDA_HIGH();
  148. IIC_Delayus(10); //5//delay25us();
  149. IIC_SCL_HIGH();
  150. IIC_Delayus(10); //5//delay25us();
  151. IIC_SCL_LOW();
  152. IIC_Delayus(10); //5//delay25us();
  153. }
  154. /*检查I2C是否有ACK响应 */
  155. BOOL I2C_CheckAck(void)
  156. {
  157. BOOL tempAck;
  158. IIC_SDA_Chg_out(); //dwd
  159. IIC_SDA_HIGH(); //dwd
  160. IIC_Delayus(10); //5//delay25us();
  161. IIC_SDA_Chg_in();
  162. IIC_Delayus(10); //5//delay25us();
  163. IIC_SCL_HIGH();
  164. IIC_Delayus(10); //5//delay25us();
  165. if(IIC_SDA_3V3_STATE) {
  166. tempAck = FALSE;
  167. } else {
  168. tempAck = TRUE;
  169. }
  170. IIC_SCL_LOW();
  171. IIC_Delayus(10); //5//delay25us();
  172. return tempAck;
  173. }
  174. void IIC_SendByte(unsigned char data)
  175. {
  176. unsigned char BitCnt;
  177. IIC_SDA_Chg_out();
  178. for(BitCnt=8;BitCnt>=1;BitCnt--)
  179. {
  180. if ((data>>(BitCnt-1))&0x01) {
  181. IIC_SDA_HIGH();
  182. } else {
  183. IIC_SDA_LOW();
  184. }
  185. IIC_Delayus(10); //5//delay25us();
  186. IIC_SCL_HIGH();
  187. IIC_Delayus(10); //5//delay25us();
  188. IIC_SCL_LOW();
  189. IIC_Delayus(10); //5//delay25us();
  190. }
  191. }
  192. U08 I2CReceiveByte(U08 ack)
  193. {
  194. U08 serialNum = 0;
  195. U08 dataValue=0;
  196. IIC_SDA_Chg_in(); //输入
  197. for(serialNum=0;serialNum<=7;serialNum++)
  198. {
  199. IIC_SCL_LOW();
  200. IIC_Delayus(10); //5//delay25us();
  201. IIC_SCL_HIGH();
  202. dataValue <<=1;
  203. if (IIC_SDA_3V3_STATE) {
  204. dataValue |= 0X01;
  205. }
  206. IIC_Delayus(10); //5//delay25us();
  207. }
  208. if (ack ==1)
  209. {
  210. IIC_SendNoAck();
  211. } else {
  212. IIC_SendAck();
  213. }
  214. return dataValue;
  215. }
  216. unsigned char I2C_ReadByte(void)
  217. {
  218. U08 i;
  219. U08 value;
  220. /* 先读取最高位即bit7 */
  221. value = 0;
  222. for(i = 0 ; i < 8 ; i++)
  223. {
  224. value <<= 1;
  225. IIC_SCL_HIGH();
  226. IIC_Delayus(10); //5//delay25us();
  227. if(IIC_SDA_3V3_STATE)
  228. {
  229. value++;
  230. }
  231. IIC_SCL_LOW();
  232. IIC_Delayus(10); //5//delay25us();
  233. }
  234. return value;
  235. }
  236. void SlaveI2CFM1288Write(U16 tarAddress,U16 wrNumber)
  237. {
  238. BOOL rxdAck;
  239. IIC_Start();
  240. IIC_SendByte(0xc0);
  241. rxdAck=I2C_CheckAck();
  242. // 0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x01, 0x40,
  243. IIC_SendByte (0xfc);
  244. I2C_CheckAck();
  245. IIC_SendByte (0xf3);
  246. I2C_CheckAck();
  247. IIC_SendByte (0x3b);
  248. I2C_CheckAck();
  249. IIC_SendByte (HI_BYTE(tarAddress));
  250. I2C_CheckAck();
  251. IIC_SendByte (LO_BYTE(tarAddress));
  252. I2C_CheckAck();
  253. IIC_SendByte (HI_BYTE(wrNumber));
  254. I2C_CheckAck();
  255. IIC_SendByte (LO_BYTE(wrNumber));
  256. I2C_CheckAck();
  257. IIC_Stop();
  258. }
  259. void NewSlaveI2CFM1288Write(unsigned char tarAddress,U16 wrNumber,unsigned char* wrPointer)
  260. {
  261. BOOL rxdAck;
  262. IIC_Start();
  263. IIC_SendByte(0xc0);
  264. rxdAck=I2C_CheckAck();
  265. for(;wrNumber !=0;wrNumber--,wrPointer ++)
  266. {
  267. IIC_SendByte(*wrPointer); //按字节写入数据
  268. rxdAck=I2C_CheckAck();
  269. }
  270. IIC_Stop();
  271. }
  272. void SlaveI2CFM1288Read(unsigned char tarAddress,unsigned char *pData,U08 Lenght)
  273. {
  274. BOOL rxdAck;
  275. IIC_Start();
  276. IIC_SendByte(0xc0);
  277. rxdAck=I2C_CheckAck();
  278. IIC_SendByte(0xfc);
  279. rxdAck=I2C_CheckAck();
  280. IIC_SendByte(0xf3);
  281. rxdAck=I2C_CheckAck();
  282. IIC_SendByte(0x37);
  283. rxdAck=I2C_CheckAck();
  284. IIC_SendByte(0x38);
  285. rxdAck=I2C_CheckAck();
  286. IIC_SendByte(0x07);
  287. rxdAck=I2C_CheckAck();
  288. IIC_Stop();
  289. IIC_Start();
  290. IIC_SendByte(0xc1);
  291. rxdAck=I2C_CheckAck();
  292. // IIC_Delayus(200); //5//delay25us();
  293. // IIC_SendByte(0x37);
  294. // rxdAck=I2C_CheckAck();
  295. // if (!I2C_CheckAck()) {
  296. // IIC_Stop();
  297. // return;
  298. //}
  299. *pData = I2CReceiveByte(0);
  300. pData ++;
  301. IIC_SendAck();
  302. *pData = I2CReceiveByte(0);
  303. IIC_SendNoAck();
  304. IIC_Stop();
  305. }
  306. ///*******************************************************************
  307. // 用户接口函数
  308. //*******************************************************************/
  309. ///*******************************************************************
  310. // 向无子地址器件发送字节数据函数
  311. //功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
  312. // 如果返回1表示操作成功,否则操作有误。
  313. //注意: 使用前必须已结束总线。
  314. //********************************************************************/
  315. //u8 ISendByte_NoSub(unsigned char sla,unsigned char c)
  316. //{
  317. // unsigned char i;
  318. // for(i=0;i<5;i++)
  319. // {
  320. // Start_I2c(); /*启动总线*/
  321. // SendByte(sla); /*发送器件地址*/
  322. // if(IIC_ack==0)
  323. // {
  324. // Stop_I2c(); /*结束总线*/
  325. // continue;
  326. // }
  327. // SendByte(c); /*发送数据*/
  328. // if(IIC_ack==0)
  329. // {
  330. // Stop_I2c(); /*结束总线*/
  331. // continue;
  332. // }
  333. // //if(IIC_ack==0)return(0);
  334. // Stop_I2c(); /*结束总线*/
  335. // break;
  336. // }
  337. //#ifdef FUNC_CAN_DIAG_EN
  338. // if(i>=5)
  339. // {
  340. // canDTC[0]=1;
  341. // return (0);
  342. // }
  343. // canDTC[0]=0;
  344. //#endif
  345. // return(1);
  346. //}
  347. ///*******************************************************************
  348. // 向有子地址器件发送字节数据函数
  349. //功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
  350. // 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
  351. // 如果返回1表示操作成功,否则操作有误。
  352. //注意: 使用前必须已结束总线。
  353. //********************************************************************/
  354. //u8 ISendByte(unsigned char sla,unsigned char suba,unsigned char c)
  355. //{
  356. // //PTED_PTED4=~PTED_PTED4;
  357. // //PTED_PTED5=~PTED_PTED5;
  358. // Start_I2c(); /*启动总线*/
  359. // SendByte(sla); /*发送器件地址*/
  360. //// if(IIC_ack==0)return(0);
  361. // SendByte(suba); /*发送器件子地址*/
  362. //// if(IIC_ack==0)return(0);
  363. // SendByte(c); /*发送数据*/
  364. // if(IIC_ack==0)return(0);
  365. // Stop_I2c(); /*结束总线*/
  366. // return(1);
  367. //}
  368. //
  369. ///*******************************************************************
  370. // 向有子地址器件发送多字节数据函数
  371. //功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
  372. // 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
  373. // 如果返回1表示操作成功,否则操作有误。
  374. //注意: 使用前必须已结束总线。
  375. //********************************************************************/
  376. //u8 ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
  377. //{
  378. // unsigned char i;
  379. // Start_I2c(); /*启动总线*/
  380. // SendByte(sla); /*发送器件地址*/
  381. // //if(IIC_ack==0)return(0);
  382. // SendByte(suba); /*发送器件子地址*/
  383. // //if(IIC_ack==0)return(0);
  384. // for(i=0;i<no;i++)
  385. // {
  386. // SendByte(*s); /*发送数据*/
  387. // //if(IIC_ack==0)return(0);
  388. // s++;
  389. // }
  390. // Stop_I2c(); /*结束总线*/
  391. // return(1);
  392. //}
  393. ///*******************************************************************
  394. // 向无子地址器件发送多字节数据函数
  395. //功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
  396. // 地址sla,发送内容是s指向的内容,发送no个字节。
  397. // 如果返回1表示操作成功,否则操作有误。
  398. //注意: 使用前必须已结束总线。
  399. //********************************************************************/
  400. //u8 ISendStr_NoSub(unsigned char sla,unsigned char *s,unsigned char no)
  401. //{
  402. // unsigned char i;
  403. // Start_I2c(); /*启动总线*/
  404. // SendByte(sla); /*发送器件地址*/
  405. // //if(IIC_ack==0)return(0);
  406. // for(i=0;i<no;i++)
  407. // {
  408. // SendByte(*s); /*发送数据*/
  409. // //if(IIC_ack==0)return(0);
  410. // s++;
  411. // }
  412. // Stop_I2c(); /*结束总线*/
  413. // return(1);
  414. //}
  415. //
  416. //
  417. ///*******************************************************************
  418. // 向无子地址器件读字节数据函数
  419. //功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
  420. // 址sla,返回值在c.
  421. // 如果返回1表示操作成功,否则操作有误。
  422. //注意: 使用前必须已结束总线。
  423. //********************************************************************/
  424. //u8 IRcvByte_NoSub(unsigned char sla,unsigned char *c)
  425. //{
  426. // Start_I2c(); /*启动总线*/
  427. // SendByte(sla); /*发送器件地址*/
  428. // //if(IIC_ack==0)return(0);
  429. // *c=RcvByte(); /*读取数据*/
  430. // IIC_ack_I2c(1); /*发送非就答位*/
  431. // Stop_I2c(); /*结束总线*/
  432. // return(1);
  433. //}
  434. ///*******************************************************************
  435. // 向有子地址器件读字节数据函数
  436. //功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
  437. // 址sla,返回值在c.
  438. // 如果返回1表示操作成功,否则操作有误。
  439. //注意: 使用前必须已结束总线。
  440. //********************************************************************/
  441. //u8 IRcvByte(unsigned char sla,unsigned char suba,unsigned char *c)
  442. //{
  443. // Start_I2c(); /*启动总线*/
  444. // SendByte(sla); /*发送器件地址*/
  445. //// if(IIC_ack==0)return(0);
  446. // SendByte(suba); /*发送器件子地址*/
  447. //// if(IIC_ack==0)return(0);
  448. // *c=RcvByte(); /*读取数据*/
  449. // IIC_ack_I2c(1); /*发送非就答位*/
  450. // Stop_I2c(); /*结束总线*/
  451. // return(1);
  452. //}
  453. //
  454. ///*******************************************************************
  455. // 向有子地址器件读取多字节数据函数
  456. //功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
  457. // 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
  458. // 如果返回1表示操作成功,否则操作有误。
  459. //注意: 使用前必须已结束总线。
  460. //********************************************************************/
  461. //u8 IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
  462. //{
  463. // unsigned char i;
  464. // Start_I2c(); /*启动总线*/
  465. // SendByte(sla); /*发送器件地址*/
  466. // if(IIC_ack==0)return(0);
  467. // SendByte(suba); /*发送器件子地址*/
  468. // if(IIC_ack==0)return(0);
  469. // Start_I2c(); /*重新启动总线*/
  470. // SendByte(sla);
  471. // if(IIC_ack==0)return(0);
  472. // for(i=0;i<no-1;i++)
  473. // {
  474. // *s=RcvByte(); /*发送数据*/
  475. // IIC_ack_I2c(0); /*发送就答位*/
  476. // s++;
  477. // }
  478. // *s=RcvByte();
  479. // IIC_ack_I2c(1); /*发送非应位*/
  480. // Stop_I2c(); /*结束总线*/
  481. // return(1);
  482. //}
  483. ///*******************************************************************
  484. // 向无子地址器件读取多字节数据函数
  485. //功能: 从启动总线到发送地址,读数据,结束总线的全过程.
  486. // 从器件地址sla,读出的内容放入s指向的存储区,
  487. // 读no个字节。如果返回1表示操作成功,否则操作有误。
  488. //注意: 使用前必须已结束总线。
  489. //********************************************************************/
  490. //u8 IRcvStr_NoSub(unsigned char sla,unsigned char *s,unsigned char no)
  491. //{
  492. // unsigned char i;
  493. // Start_I2c();
  494. // SendByte(sla);
  495. // //if(IIC_ack==0)return(0);
  496. // for(i=0;i<no-1;i++)
  497. // {
  498. // *s=RcvByte(); /*发送数据*/
  499. // IIC_ack_I2c(0); /*发送就答位*/
  500. // s++;
  501. // }
  502. // *s=RcvByte();
  503. // IIC_ack_I2c(1); /*发送非应位*/
  504. // Stop_I2c(); /*结束总线*/
  505. // return(1);
  506. //}