PressureSensor.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. #include "PressureSensor.h"
  2. #include "string.h"
  3. #include "gpio.h"
  4. #include "stdio.h"
  5. #include "ac780x.h"
  6. #define CPS135B_ADDR (0x6D)
  7. static uint8_t iic_error_count = 0;
  8. static uint8_t iic_exception = 0;
  9. static uint8_t iic_exception2 = 0;
  10. static float cps_pressure = 0;
  11. static float cps_temperature = 0;
  12. static uint32_t ret_status = 0;
  13. /**
  14. * @prototype I2C_ParaInit(void)
  15. *
  16. * @param[in] void
  17. * @return void
  18. *
  19. * @brief 初始化I2C0.
  20. */
  21. void I2C0_ParaInit(void)
  22. {
  23. I2C_ConfigType i2cConfig;
  24. /*初始化引脚功能为I2C.*/
  25. GPIO_SetFunc(GPIOA, GPIO_PIN0, GPIO_FUN3);//I2C0_SCL
  26. GPIO_SetFunc(GPIOA, GPIO_PIN1, GPIO_FUN3);//I2C0_sda
  27. /*清零结构体变量.*/
  28. memset(&i2cConfig, 0x00, sizeof(i2cConfig));
  29. /*无论是主机还是从机模式都需要配置的参数.*/
  30. i2cConfig.mode = I2C_MASTER;/*设置主从机模式.*/
  31. i2cConfig.extAddrEn = DISABLE;/*10bit扩展地址禁能.*/
  32. i2cConfig.dmaRxEn = DISABLE;/*设置DMA接收数据.*/
  33. i2cConfig.dmaTxEn = DISABLE;/*设置DMA发送数据.*/
  34. i2cConfig.interruptEn = DISABLE;/*I2C中断,BND/SAMF/ARBLOST.*/
  35. i2cConfig.nackInterruptEn = DISABLE;/*NACK中断.*/
  36. i2cConfig.ssInterruptEn = DISABLE;/*总线start或stop中断.*/
  37. i2cConfig.i2cEn = ENABLE;/*使能模块.*/
  38. i2cConfig.callBack = NULL;/*中断回调函数.*/
  39. /*主机模式需要配置的参数,配置成从机模式可忽略.*/
  40. i2cConfig.masterConfig.sampleCnt = 9;/*设置波特率为100Kbps,bandrate=(24M/(10*12*2))=100Kbps.*/
  41. i2cConfig.masterConfig.stepCnt = 11;
  42. i2cConfig.masterConfig.ARBEn = ENABLE;/*设置主机仲裁功能.*/
  43. i2cConfig.masterConfig.SYNCEn = ENABLE;/*设置主机SCL同步功能.*/
  44. /*从机模式需要配置的参数,配置成主机模式可忽略.*/
  45. //i2cConfig.slaveConfig.slaveAddr = AT24C02_DEV_ADDR;/*从机地址.*/
  46. //i2cConfig.slaveConfig.slaveRangeAddr = 0;/*从机范围地址.*/
  47. //i2cConfig.slaveConfig.glitchFilterCnt= 0;/*毛刺过滤.*/
  48. //i2cConfig.slaveConfig.stretchEn = DISABLE;/*从机SCL延伸功能.*/
  49. //i2cConfig.slaveConfig.rangeAddrEn = DISABLE;/*禁能范围地址.*/
  50. //i2cConfig.slaveConfig.monitorEn = DISABLE;/*禁能从机监测功能.*/
  51. //i2cConfig.slaveConfig.generalCallEn = DISABLE;/*从机SCL广播地址.*/
  52. //i2cConfig.slaveConfig.wakeupEn = DISABLE;/*唤醒功能,仅从机时有效.*/
  53. //i2cConfig.slaveConfig.rxOFInterruptEn = DISABLE;/*接收缓存溢出中断.*/
  54. //i2cConfig.slaveConfig.txUFInterruptEn = DISABLE;/*发送缓存溢出中断.*/
  55. I2C_Init(I2C0, &i2cConfig);
  56. }
  57. /*
  58. uint8_t cps135b_readbyte(uint8_t addr)
  59. {
  60. uint8_t data;
  61. I2C_MasterTransmitPoll(I2C0, CPS135B_ADDR, &addr, 1, DISABLE);//发送读取地址
  62. I2C_MasterReceivePoll(I2C0, CPS135B_ADDR, &data, 1);//读取数据
  63. return data;
  64. }
  65. void cps135b_writebyte(uint8_t addr, uint8_t data)
  66. {
  67. uint8_t buffer[2];
  68. buffer[0] = addr;
  69. buffer[1] = data;
  70. I2C_MasterTransmitPoll(I2C0, CPS135B_ADDR, buffer, 2, ENABLE);//发送读取地址
  71. }
  72. void cps135b_mr()
  73. {
  74. uint8_t buffer[2];
  75. buffer[0] = 0x30;
  76. buffer[1] = 0x0A;
  77. I2C_MasterTransmitPoll(I2C0, CPS135B_ADDR, buffer, 2, ENABLE);//发送读取地址
  78. }
  79. uint8_t cps135b_gd(float* pressure, float* temperature)
  80. {
  81. uint32_t status = I2C_HW_STATUS_ERROR_NULL;
  82. uint32_t tmp = 0;
  83. uint8_t reg_addr = 0x06;
  84. uint8_t data[5];
  85. status |= I2C_MasterTransmitPoll(I2C0, CPS135B_ADDR, &reg_addr, 1, DISABLE);//发送读取地址
  86. status |= I2C_MasterReceivePoll(I2C0, CPS135B_ADDR, data, 5);//读取数据
  87. if(I2C_HW_STATUS_ERROR_NULL == status){
  88. tmp = (uint32_t)data[0]<<16;
  89. tmp += (uint32_t)data[1]<<8;
  90. tmp += data[2];
  91. *pressure = (1.0*tmp)/256;
  92. tmp = 0;
  93. tmp += (uint32_t)data[3]<<8;
  94. tmp += data[4];
  95. if(data[3] <= 128){
  96. *temperature = 1.0*tmp/256;
  97. }else{
  98. *temperature = 1.0*(tmp-65535)/256;
  99. }
  100. return 0;
  101. }else{
  102. return 1;
  103. }
  104. }
  105. */
  106. void PressureSensor_Init(void)
  107. {
  108. I2C0_ParaInit();
  109. iic_error_count = 0;
  110. cps_pressure = 0;
  111. cps_temperature = 0;
  112. }
  113. uint8_t PressureSensor_MR(void)
  114. {
  115. uint8_t buffer[2];
  116. buffer[0] = 0x30;
  117. buffer[1] = 0x0A;
  118. //反复几次出现问题,直接返回异常
  119. if(iic_exception2 > 3){
  120. return 1;
  121. }
  122. ret_status = I2C_HW_STATUS_ERROR_NULL;
  123. ret_status = I2C_MasterTransmitPoll(I2C0, CPS135B_ADDR, buffer, 2, ENABLE);//发送读取地址
  124. if(I2C_HW_STATUS_ERROR_NULL == ret_status){
  125. return 0;
  126. }else{
  127. return 1;
  128. }
  129. }
  130. uint8_t PressureSensor_Read(void)
  131. {
  132. uint32_t tmp = 0;
  133. uint8_t reg_addr = 0x06;
  134. uint8_t data[5];
  135. if(iic_exception2 > 3){
  136. //反复几次出现问题,直接返回异常
  137. return 1;
  138. }
  139. ret_status = I2C_HW_STATUS_ERROR_NULL;
  140. ret_status |= I2C_MasterTransmitPoll(I2C0, CPS135B_ADDR, &reg_addr, 1, DISABLE);//发送读取地址
  141. ret_status |= I2C_MasterReceivePoll(I2C0, CPS135B_ADDR, data, 5);//读取数据
  142. if(I2C_HW_STATUS_ERROR_NULL == ret_status){
  143. tmp = (uint32_t)data[0]<<16;
  144. tmp += (uint32_t)data[1]<<8;
  145. tmp += data[2];
  146. cps_pressure = (1.0*tmp)/256/1000; //kPa
  147. tmp = 0;
  148. tmp += (uint32_t)data[3]<<8;
  149. tmp += data[4];
  150. if(data[3] <= 128){
  151. cps_temperature = 1.0*tmp/256;
  152. }else{
  153. cps_temperature = 1.0*(tmp-65535)/256;
  154. }
  155. iic_error_count = 0;
  156. iic_exception =0;
  157. }else{
  158. iic_error_count++;
  159. }
  160. if(iic_error_count >= 3){
  161. iic_exception =1;
  162. PressureSensor_DeInit();
  163. PressureSensor_Init();
  164. iic_exception2++;
  165. }
  166. return iic_exception;
  167. }
  168. uint8_t PressureSensor_Getvalue(float* pressure)
  169. {
  170. uint32_t status = I2C_HW_STATUS_ERROR_NULL;
  171. uint32_t tmp = 0;
  172. uint8_t reg_addr = 0x06;
  173. uint8_t data[3];
  174. status |= I2C_MasterTransmitPoll(I2C0, CPS135B_ADDR, &reg_addr, 1, DISABLE);//发送读取地址
  175. status |= I2C_MasterReceivePoll(I2C0, CPS135B_ADDR, data, 3);//读取数据
  176. if(I2C_HW_STATUS_ERROR_NULL == status){
  177. tmp = (uint32_t)data[0]<<16;
  178. tmp += (uint32_t)data[1]<<8;
  179. tmp += data[2];
  180. *pressure = (1.0*tmp)/256;
  181. return 0;
  182. }else{
  183. return 1;
  184. }
  185. }
  186. uint8_t PressureSensor_Getvalue2(float* pressure, float* temperature)
  187. {
  188. *pressure = cps_pressure;
  189. *temperature = cps_temperature;
  190. return iic_exception;
  191. }
  192. uint8_t PressureSensor_Print(void)
  193. {
  194. float pressure = 0.0;
  195. float temperature = 0.0;
  196. //PressureSensor_Getvalue(&pressure);
  197. PressureSensor_Getvalue2(&pressure, &temperature);
  198. printf("PressureSenso: pressure:%f temperature:%f \r\n", pressure, temperature);
  199. }
  200. void PressureSensor_DeInit(void)
  201. {
  202. I2C_DeInit(I2C0);
  203. }
  204. void PressureSensor_Release(void)
  205. {
  206. I2C_DeInit(I2C0);
  207. }