基质喷涂
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

446 lines
12 KiB

  1. #include "t_rh_iic.h"
  2. #include <../../../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h>
  3. MYI2C_Struct SENx;
  4. /**********************************************
  5. //MYI2C_Delay_us
  6. **********************************************/
  7. void MYI2C_Delay_us(unsigned long nTim)
  8. {
  9. unsigned int i;
  10. while(nTim--)
  11. {
  12. i = MYI2C_delay_us_cnt;
  13. while(i--);
  14. }
  15. }
  16. /*******************************************************************************
  17. * Function Name : MYI2C_GPIO_MODE
  18. * Description : Configures the different GPIO ports.
  19. * Input : None
  20. * Output : None
  21. * Return : None
  22. *******************************************************************************/
  23. void MYI2C_GPIO_MODE(unsigned char TYP) //根据MCU修改相应的IO初始化
  24. {
  25. #ifdef ARM32
  26. GPIO_InitTypeDef GPIO_InitStruct;
  27. __HAL_RCC_GPIOF_CLK_ENABLE(); // 使能GPIOF时钟
  28. #endif
  29. switch(TYP)
  30. {
  31. case SDA_OUT://设置开漏输出,需要加外部上拉电阻
  32. #ifdef ARM32
  33. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  34. GPIO_InitStruct.Pin = SDA_Pin;
  35. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  36. HAL_GPIO_Init(IIC_SDA_PORT, &GPIO_InitStruct);
  37. #else
  38. P0M0 |= 1<<3; P0M1 |= 3<<2;
  39. #endif
  40. break;
  41. case SDA_IN://设置输入,需要加外部上拉电阻
  42. #ifdef ARM32
  43. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  44. GPIO_InitStruct.Pull = GPIO_PULLUP;
  45. GPIO_InitStruct.Pin = SDA_Pin;
  46. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  47. HAL_GPIO_Init(IIC_SDA_PORT, &GPIO_InitStruct);
  48. #else
  49. P0M0 &= ~(1<<3); P0M1 |= 3<<2;
  50. #endif
  51. break;
  52. case SCL_OUT://设置开漏输出,需要加外部上拉电阻
  53. #ifdef ARM32
  54. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  55. GPIO_InitStruct.Pin = SCL_Pin;
  56. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  57. HAL_GPIO_Init(IIC_SCL_PORT, &GPIO_InitStruct);
  58. #else
  59. P0M0 |= 1<<2; P0M1 |= 3<<2;
  60. #endif
  61. break;
  62. }
  63. }
  64. /*******************************************************************************
  65. * Function Name : MYI2C_GPIO_DATA
  66. * Description : Configures the different GPIO ports.
  67. * Input : None
  68. * Output : None
  69. * Return : None
  70. *******************************************************************************/
  71. unsigned char MYI2C_GPIO_DATA(unsigned char TYP)//根据MCU修改相应的IO操作
  72. {
  73. unsigned int dat = 0;
  74. switch(TYP)
  75. {
  76. case SDA_H:
  77. #ifdef ARM32
  78. HAL_GPIO_WritePin(IIC_SDA_PORT, SDA_Pin, GPIO_PIN_SET);
  79. #else
  80. I2C_SDA_PIN = 1;
  81. #endif
  82. break;
  83. case SDA_L:
  84. #ifdef ARM32
  85. HAL_GPIO_WritePin(IIC_SDA_PORT, SDA_Pin, GPIO_PIN_RESET);
  86. #else
  87. I2C_SDA_PIN = 0;
  88. #endif
  89. break;
  90. case SCL_H:
  91. #ifdef ARM32
  92. HAL_GPIO_WritePin(IIC_SCL_PORT, SCL_Pin, GPIO_PIN_SET);
  93. #else
  94. I2C_SCL_PIN = 1;
  95. #endif
  96. break;
  97. case SCL_L:
  98. #ifdef ARM32
  99. HAL_GPIO_WritePin(IIC_SCL_PORT, SCL_Pin, GPIO_PIN_RESET);
  100. #else
  101. I2C_SCL_PIN = 0;
  102. #endif
  103. break;
  104. case SDA_R:
  105. #ifdef ARM32
  106. dat = HAL_GPIO_ReadPin(IIC_SDA_PORT, SDA_Pin);
  107. #else
  108. dat = I2C_SDA_PIN;
  109. #endif
  110. break;
  111. }
  112. return dat;
  113. }
  114. /**********************************************
  115. //IIC Start
  116. **********************************************/
  117. void MYI2C_IIC_Start(void)
  118. {
  119. MYI2C_SCK_Set();
  120. MYI2C_SDA_Set();
  121. MYI2C_SDA_Clr();
  122. MYI2C_SCK_Clr();
  123. }
  124. /**********************************************
  125. //IIC Stop
  126. **********************************************/
  127. void MYI2C_IIC_Stop(void)
  128. {
  129. MYI2C_SCK_Clr();
  130. MYI2C_SDA_Clr();
  131. MYI2C_SCK_Set();
  132. MYI2C_SDA_Set();
  133. }
  134. /**********************************************
  135. //IIC Ack
  136. **********************************************/
  137. void MYI2C_IIC_Ack(unsigned char ack)
  138. {
  139. MYI2C_SCK_Clr();
  140. if(ack)
  141. {
  142. MYI2C_SDA_Clr();
  143. }
  144. else
  145. {
  146. MYI2C_SDA_Set();
  147. }
  148. MYI2C_SCK_Set();
  149. }
  150. /**********************************************
  151. //IIC Wait_Ack
  152. **********************************************/
  153. unsigned char MYI2C_IIC_Wait_Ack(unsigned int wait_time)
  154. {
  155. MYI2C_SCK_Clr();
  156. MYI2C_SDA_IN_Mode;
  157. MYI2C_SDA_Set();
  158. MYI2C_SCK_Set();
  159. while(wait_time)
  160. {
  161. if(MYI2C_GPIO_DATA(SDA_R) == 0) break;
  162. MYI2C_Delay_us(1);
  163. wait_time--;
  164. }
  165. MYI2C_SDA_OD_Mode;
  166. return wait_time;
  167. }
  168. /**********************************************
  169. // IIC Write byte
  170. **********************************************/
  171. void MYI2C_Write_IIC_Byte(unsigned char dat)
  172. {
  173. unsigned char i;
  174. for(i = 0; i < 8; i++)
  175. {
  176. MYI2C_SCK_Clr();
  177. if(dat & 0x80)
  178. {
  179. MYI2C_SDA_Set();
  180. }
  181. else
  182. {
  183. MYI2C_SDA_Clr();
  184. }
  185. MYI2C_SCK_Set();
  186. dat = dat << 1;
  187. }
  188. }
  189. /**********************************************
  190. // IIC Read byte
  191. **********************************************/
  192. unsigned char MYI2C_Read_IIC_Byte(void)
  193. {
  194. unsigned char i, byt = 0;
  195. MYI2C_SCK_Clr();
  196. MYI2C_SDA_IN_Mode;
  197. MYI2C_SDA_Set();
  198. for(i = 0; i < 8; i++)
  199. {
  200. MYI2C_SCK_Clr();
  201. if(MYI2C_GPIO_DATA(SDA_R)) byt++;
  202. MYI2C_SCK_Set();
  203. if(i < 7) byt = byt << 1;
  204. }
  205. MYI2C_SDA_OD_Mode;
  206. return byt;
  207. }
  208. /*******************************************************************************
  209. * Function Name : MYI2C_Init
  210. * Description : MYI2C
  211. * Input : None
  212. * Output : None
  213. * Return :None
  214. *******************************************************************************/
  215. void MYI2C_Init(MYI2C_Struct *pst,unsigned int ReadTimMS,unsigned char xAddr)
  216. {
  217. pst->Adrr = xAddr;
  218. pst->Step = SENSOR_IDLE;
  219. if(ReadTimMS > MinReadTim) pst->SetRTim = ReadTimMS;
  220. else pst->SetRTim = MinReadTim;
  221. MYI2C_SCK_OD_Mode;
  222. MYI2C_SDA_OD_Mode;
  223. MYI2C_SCK_Set();
  224. MYI2C_SDA_Set();
  225. }
  226. /*******************************************************************************
  227. * Function Name :
  228. * Description :
  229. * Input :None
  230. * Output :None
  231. * Return :None
  232. *******************************************************************************/
  233. unsigned char MYI2C_READ_FUNC(MYI2C_Struct *pst,unsigned char device_addr,unsigned char register_addr,unsigned char *pDat,unsigned char len)
  234. {
  235. unsigned char NoAck = 0;
  236. if(register_addr)
  237. {
  238. /* Send STRAT condition a second time */
  239. MYI2C_IIC_Start();
  240. /* Send slave address for Write Regsiter */
  241. MYI2C_Write_IIC_Byte((device_addr << 1) + 0);
  242. /* Ack */
  243. if(MYI2C_IIC_Wait_Ack(Wait_Ack_time) == 0) NoAck++;
  244. /*Send register_addr*/
  245. MYI2C_Write_IIC_Byte((register_addr));
  246. /* Ack */
  247. if(MYI2C_IIC_Wait_Ack(Wait_Ack_time) == 0) NoAck++;
  248. MYI2C_SCK_Clr();
  249. MYI2C_SCK_Set();
  250. }
  251. /* Send STRAT condition a second time */
  252. MYI2C_IIC_Start();
  253. /* Send slave address for Read */
  254. MYI2C_Write_IIC_Byte((device_addr << 1) + 1);
  255. /* Ack */
  256. if(MYI2C_IIC_Wait_Ack(Wait_Ack_time) == 0) NoAck++;
  257. /* While there is data to be read */
  258. while(len && NoAck == 0 && len < MYI2C_Buffer_Size)
  259. {
  260. *pDat = MYI2C_Read_IIC_Byte();
  261. /* Ack */
  262. MYI2C_IIC_Ack(len - 1);
  263. pDat++;
  264. len--;
  265. }
  266. /* Send STOP Condition */
  267. MYI2C_IIC_Stop();
  268. pst->ErrFlag = NoAck;
  269. return NoAck;
  270. }
  271. /*******************************************************************************
  272. * Function Name :
  273. * Description :
  274. * Input : None
  275. * Output : None
  276. * Return :None
  277. *******************************************************************************/
  278. unsigned char MYI2C_WRITE_FUNC(MYI2C_Struct *pst,unsigned char device_addr,unsigned char register_addr,unsigned char *pDat,unsigned char len)
  279. {
  280. unsigned int NoAck = 0;
  281. /* Send STRAT condition */
  282. MYI2C_IIC_Start();
  283. /* Send slave address for write */
  284. MYI2C_Write_IIC_Byte((device_addr << 1) + 0);
  285. /* ACK */
  286. if(MYI2C_IIC_Wait_Ack(Wait_Ack_time) == 0) NoAck++;
  287. /* Send register_addr for read */
  288. MYI2C_Write_IIC_Byte((register_addr));
  289. /* ACK */
  290. if(MYI2C_IIC_Wait_Ack(Wait_Ack_time) == 0) NoAck++;
  291. while(NoAck == 0 && len && len < MYI2C_Buffer_Size)
  292. {
  293. /* Send the byte to be written */
  294. MYI2C_Write_IIC_Byte(*pDat);
  295. /* Acknowledgement */
  296. MYI2C_IIC_Wait_Ack(Wait_Ack_time);
  297. pDat++;
  298. len--;
  299. }
  300. /* Send STOP condition */
  301. MYI2C_IIC_Stop();
  302. pst->ErrFlag = NoAck;
  303. return NoAck;
  304. }
  305. /*******************************************************************************
  306. * Function Name : CheckCrc
  307. * Description :
  308. * Input : None
  309. * Output : None
  310. * Return :None
  311. *******************************************************************************/
  312. unsigned char CheckCrc8(unsigned char *pDat,unsigned char Lenth)
  313. {
  314. unsigned char crc = 0xff, i, j;
  315. for (i = 0; i < Lenth ; i++)
  316. {
  317. crc = crc ^ *pDat;
  318. for (j = 0; j < 8; j++)
  319. {
  320. if (crc & 0x80) crc = (crc << 1) ^ 0x31;
  321. else crc <<= 1;
  322. }
  323. pDat++;
  324. }
  325. return crc;
  326. }
  327. /*******************************************************************************
  328. * Function Name :
  329. * Description :
  330. * Input :None
  331. * Output :None
  332. * Return :None
  333. *******************************************************************************/
  334. void MYI2C_Handle(MYI2C_Struct *pst)
  335. {
  336. unsigned char i;
  337. unsigned long s32x;
  338. pst->timcnt += MYI2C_Tick;
  339. if(pst->timcnt > PowerOnTim && pst->Step == SENSOR_IDLE)
  340. {
  341. pst->Step = SENSOR_MEASURE;
  342. pst->SendByte[0] = 0x33;
  343. pst->SendByte[1] = 0x00;
  344. MYI2C_WRITE_FUNC(pst, pst->Adrr, 0xAC, &pst->SendByte[0], 2);
  345. }
  346. else if(pst->timcnt > MeasureTim && pst->Step == SENSOR_MEASURE)
  347. {
  348. pst->Step = SENSOR_COMPLETE;
  349. MYI2C_READ_FUNC(pst, pst->Adrr, 0, &pst->ReadByte[0], 7);
  350. if(pst->ErrFlag == 0)
  351. {
  352. if((CheckCrc8(&pst->ReadByte[0], 6) == pst->ReadByte[6]) && ((pst->ReadByte[0] & 0x98) == 0x18))
  353. {
  354. s32x = pst->ReadByte[1];
  355. s32x = s32x << 8;
  356. s32x += pst->ReadByte[2];
  357. s32x = s32x << 8;
  358. s32x += pst->ReadByte[3];
  359. s32x = s32x >> 4;
  360. pst->RH = s32x;
  361. pst->RH = pst->RH * 100 / 1048576;
  362. s32x = pst->ReadByte[3] & 0x0F;
  363. s32x = s32x << 8;
  364. s32x += pst->ReadByte[4];
  365. s32x = s32x << 8;
  366. s32x += pst->ReadByte[5];
  367. pst->T = s32x;
  368. pst->T = pst->T * 200 / 1048576 - 50;
  369. }
  370. }
  371. else
  372. {
  373. pst->RH = 0;
  374. pst->T = 0;
  375. }
  376. }
  377. else if(pst->timcnt > pst->SetRTim)
  378. {
  379. pst->Step = SENSOR_IDLE;
  380. pst->timcnt = 0;
  381. }
  382. }
  383. void ReadTemperatureAndHumidity(MYI2C_Struct *pst) {
  384. unsigned long s32x;
  385. MYI2C_READ_FUNC(pst, pst->Adrr, 0, &pst->ReadByte[0], 7);
  386. if(pst->ErrFlag == 0) {
  387. if((CheckCrc8(&pst->ReadByte[0], 6) == pst->ReadByte[6]) && ((pst->ReadByte[0] & 0x98) == 0x18)) {
  388. s32x = pst->ReadByte[1];
  389. s32x = s32x << 8;
  390. s32x += pst->ReadByte[2];
  391. s32x = s32x << 8;
  392. s32x += pst->ReadByte[3];
  393. s32x = s32x >> 4;
  394. pst->RH = s32x;
  395. pst->RH = pst->RH * 100 / 1048576;
  396. s32x = pst->ReadByte[3] & 0x0F;
  397. s32x = s32x << 8;
  398. s32x += pst->ReadByte[4];
  399. s32x = s32x << 8;
  400. s32x += pst->ReadByte[5];
  401. pst->T = s32x;
  402. pst->T = pst->T * 200 / 1048576 - 50;
  403. }
  404. } else {
  405. pst->RH = 0;
  406. pst->T = 0;
  407. }
  408. }