spl06_01.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. #include <rtthread.h>
  2. #include <rtdevice.h>
  3. #include "spl06_01.h"
  4. #define HW_ADR 0x77
  5. static void spl0601_get_calib_param(spl0601_t *hdev);
  6. /*****************************************************************************
  7. 函 数 名 : spl0601_write
  8. 功能描述 : I2C 寄存器写入子函数
  9. 输入参数 : uint8_t hwadr 硬件地址
  10. uint8_t regadr 寄存器地址
  11. uint8_t val 值
  12. 输出参数 : 无
  13. 返 回 值 :
  14. 调用函数 :
  15. 被调函数 :
  16. 修改历史 :
  17. 1.日 期 : 2015年11月30日
  18. 作 者 : WL
  19. 修改内容 : 新生成函数
  20. *****************************************************************************/
  21. static void spl0601_write(spl0601_t *hdev, uint8_t hwadr, uint8_t regadr, uint8_t val)
  22. {
  23. uint8_t buf[2] = { regadr, val };
  24. struct rt_i2c_msg msg;
  25. msg.addr = hwadr;
  26. msg.buf = buf;
  27. msg.len = 2;
  28. msg.flags = RT_I2C_WR;
  29. rt_i2c_transfer(hdev->bus, &msg, 1);
  30. }
  31. /*****************************************************************************
  32. 函 数 名 : spl0601_read
  33. 功能描述 : I2C 寄存器读取子函数
  34. 输入参数 : uint8_t hwadr 硬件地址
  35. uint8_t regadr 寄存器地址
  36. 输出参数 :
  37. 返 回 值 : uint8_t 读出值
  38. 调用函数 :
  39. 被调函数 :
  40. 修改历史 :
  41. 1.日 期 : 2015年11月30日
  42. 作 者 : WL
  43. 修改内容 : 新生成函数
  44. *****************************************************************************/
  45. static uint8_t spl0601_read(spl0601_t *hdev, uint8_t hwadr, uint8_t regadr)
  46. {
  47. struct rt_i2c_msg msg;
  48. msg.addr = hwadr;
  49. msg.buf = &regadr;
  50. msg.len = 1;
  51. msg.flags = RT_I2C_WR;
  52. rt_i2c_transfer(hdev->bus, &msg, 1);
  53. msg.flags = RT_I2C_RD;
  54. rt_i2c_transfer(hdev->bus, &msg, 1);
  55. return regadr;
  56. }
  57. /*****************************************************************************
  58. 函 数 名 : spl0601_init
  59. 功能描述 : SPL06-01 初始化函数
  60. 输入参数 : void
  61. 输出参数 : 无
  62. 返 回 值 :
  63. 调用函数 :
  64. 被调函数 :
  65. 修改历史 :
  66. 1.日 期 : 2015年11月30日
  67. 作 者 : WL
  68. 修改内容 : 新生成函数
  69. *****************************************************************************/
  70. int spl0601_init(spl0601_t *hdev, const char *busname)
  71. {
  72. hdev->bus = rt_i2c_bus_device_find(busname);
  73. if (hdev->bus == RT_NULL)
  74. {
  75. return -1;
  76. }
  77. hdev->i32rawPressure = 0;
  78. hdev->i32rawTemperature = 0;
  79. hdev->chip_id = 0x34; /* read Chip Id */
  80. spl0601_get_calib_param(hdev);
  81. // sampling rate = 1Hz; Pressure oversample = 2;
  82. spl0601_rateset(hdev, PRESSURE_SENSOR, 32, 8);
  83. // sampling rate = 1Hz; Temperature oversample = 1;
  84. spl0601_rateset(hdev, TEMPERATURE_SENSOR, 32, 8);
  85. //Start background measurement
  86. return 0;
  87. }
  88. /*****************************************************************************
  89. 函 数 名 : spl0601_rateset
  90. 功能描述 : 设置温度传感器的每秒采样次数以及过采样率
  91. 输入参数 : uint8_t u8OverSmpl 过采样率 Maximal = 128
  92. uint8_t u8SmplRate 每秒采样次数(Hz) Maximal = 128
  93. uint8_t iSensor 0: Pressure; 1: Temperature
  94. 输出参数 : 无
  95. 返 回 值 : 无
  96. 调用函数 :
  97. 被调函数 :
  98. 修改历史 :
  99. 1.日 期 : 2015年11月24日
  100. 作 者 : WL
  101. 修改内容 : 新生成函数
  102. *****************************************************************************/
  103. void spl0601_rateset(spl0601_t *hdev, uint8_t iSensor, uint8_t u8SmplRate, uint8_t u8OverSmpl)
  104. {
  105. uint8_t reg = 0;
  106. int32_t i32kPkT = 0;
  107. switch(u8SmplRate)
  108. {
  109. case 2:
  110. reg |= (1<<4);
  111. break;
  112. case 4:
  113. reg |= (2<<4);
  114. break;
  115. case 8:
  116. reg |= (3<<4);
  117. break;
  118. case 16:
  119. reg |= (4<<4);
  120. break;
  121. case 32:
  122. reg |= (5<<4);
  123. break;
  124. case 64:
  125. reg |= (6<<4);
  126. break;
  127. case 128:
  128. reg |= (7<<4);
  129. break;
  130. case 1:
  131. default:
  132. break;
  133. }
  134. switch(u8OverSmpl)
  135. {
  136. case 2:
  137. reg |= 1;
  138. i32kPkT = 1572864;
  139. break;
  140. case 4:
  141. reg |= 2;
  142. i32kPkT = 3670016;
  143. break;
  144. case 8:
  145. reg |= 3;
  146. i32kPkT = 7864320;
  147. break;
  148. case 16:
  149. i32kPkT = 253952;
  150. reg |= 4;
  151. break;
  152. case 32:
  153. i32kPkT = 516096;
  154. reg |= 5;
  155. break;
  156. case 64:
  157. i32kPkT = 1040384;
  158. reg |= 6;
  159. break;
  160. case 128:
  161. i32kPkT = 2088960;
  162. reg |= 7;
  163. break;
  164. case 1:
  165. default:
  166. i32kPkT = 524288;
  167. break;
  168. }
  169. if(iSensor == PRESSURE_SENSOR)
  170. {
  171. hdev->i32kP = i32kPkT;
  172. spl0601_write(hdev, HW_ADR, 0x06, reg);
  173. if(u8OverSmpl > 8)
  174. {
  175. reg = spl0601_read(hdev, HW_ADR, 0x09);
  176. spl0601_write(hdev, HW_ADR, 0x09, reg | 0x04);
  177. }
  178. else
  179. {
  180. reg = spl0601_read(hdev, HW_ADR, 0x09);
  181. spl0601_write(hdev, HW_ADR, 0x09, reg & (~0x04));
  182. }
  183. }
  184. if(iSensor == TEMPERATURE_SENSOR)
  185. {
  186. hdev->i32kT = i32kPkT;
  187. spl0601_write(hdev, HW_ADR, 0x07, reg|0x80); //Using mems temperature
  188. if(u8OverSmpl > 8)
  189. {
  190. reg = spl0601_read(hdev, HW_ADR, 0x09);
  191. spl0601_write(hdev, HW_ADR, 0x09, reg | 0x08);
  192. }
  193. else
  194. {
  195. reg = spl0601_read(hdev, HW_ADR, 0x09);
  196. spl0601_write(hdev, HW_ADR, 0x09, reg & (~0x08));
  197. }
  198. }
  199. }
  200. /*****************************************************************************
  201. 函 数 名 : spl0601_get_calib_param
  202. 功能描述 : 获取校准参数
  203. 输入参数 : void
  204. 输出参数 : 无
  205. 返 回 值 :
  206. 调用函数 :
  207. 被调函数 :
  208. 修改历史 :
  209. 1.日 期 : 2015年11月30日
  210. 作 者 : WL
  211. 修改内容 : 新生成函数
  212. *****************************************************************************/
  213. static void spl0601_get_calib_param(spl0601_t *hdev)
  214. {
  215. uint32_t h;
  216. uint32_t m;
  217. uint32_t l;
  218. h = spl0601_read(hdev, HW_ADR, 0x10);
  219. l = spl0601_read(hdev, HW_ADR, 0x11);
  220. hdev->calib_param.c0 = (uint32_t)h<<4 | l>>4;
  221. hdev->calib_param.c0 = (hdev->calib_param.c0&0x0800)?(0xF000|hdev->calib_param.c0):hdev->calib_param.c0;
  222. h = spl0601_read(hdev, HW_ADR, 0x11);
  223. l = spl0601_read(hdev, HW_ADR, 0x12);
  224. hdev->calib_param.c1 = (uint32_t)(h&0x0F)<<8 | l;
  225. hdev->calib_param.c1 = (hdev->calib_param.c1&0x0800)?(0xF000|hdev->calib_param.c1):hdev->calib_param.c1;
  226. h = spl0601_read(hdev, HW_ADR, 0x13);
  227. m = spl0601_read(hdev, HW_ADR, 0x14);
  228. l = spl0601_read(hdev, HW_ADR, 0x15);
  229. hdev->calib_param.c00 = (int32_t)h<<12 | (int32_t)m<<4 | (int32_t)l>>4;
  230. hdev->calib_param.c00 = (hdev->calib_param.c00&0x080000)?(0xFFF00000|hdev->calib_param.c00):hdev->calib_param.c00;
  231. h = spl0601_read(hdev, HW_ADR, 0x15);
  232. m = spl0601_read(hdev, HW_ADR, 0x16);
  233. l = spl0601_read(hdev, HW_ADR, 0x17);
  234. hdev->calib_param.c10 = (int32_t)(h & 0x0F) << 16 | (int32_t)m << 8 | l;
  235. hdev->calib_param.c10 = (hdev->calib_param.c10&0x080000)?(0xFFF00000|hdev->calib_param.c10):hdev->calib_param.c10;
  236. h = spl0601_read(hdev, HW_ADR, 0x18);
  237. l = spl0601_read(hdev, HW_ADR, 0x19);
  238. hdev->calib_param.c01 = (uint32_t)h<<8 | l;
  239. h = spl0601_read(hdev, HW_ADR, 0x1A);
  240. l = spl0601_read(hdev, HW_ADR, 0x1B);
  241. hdev->calib_param.c11 = (uint32_t)h<<8 | l;
  242. h = spl0601_read(hdev, HW_ADR, 0x1C);
  243. l = spl0601_read(hdev, HW_ADR, 0x1D);
  244. hdev->calib_param.c20 = (uint32_t)h<<8 | l;
  245. h = spl0601_read(hdev, HW_ADR, 0x1E);
  246. l = spl0601_read(hdev, HW_ADR, 0x1F);
  247. hdev->calib_param.c21 = (uint32_t)h<<8 | l;
  248. h = spl0601_read(hdev, HW_ADR, 0x20);
  249. l = spl0601_read(hdev, HW_ADR, 0x21);
  250. hdev->calib_param.c30 = (uint32_t)h<<8 | l;
  251. }
  252. /*****************************************************************************
  253. 函 数 名 : spl0601_start_temperature
  254. 功能描述 : 发起一次温度测量
  255. 输入参数 : void
  256. 输出参数 : 无
  257. 返 回 值 :
  258. 调用函数 :
  259. 被调函数 :
  260. 修改历史 :
  261. 1.日 期 : 2015年11月30日
  262. 作 者 : WL
  263. 修改内容 : 新生成函数
  264. *****************************************************************************/
  265. void spl0601_start_temperature(spl0601_t *hdev)
  266. {
  267. spl0601_write(hdev, HW_ADR, 0x08, 0x02);
  268. }
  269. /*****************************************************************************
  270. 函 数 名 : spl0601_start_pressure
  271. 功能描述 : 发起一次压力值测量
  272. 输入参数 : void
  273. 输出参数 : 无
  274. 返 回 值 :
  275. 调用函数 :
  276. 被调函数 :
  277. 修改历史 :
  278. 1.日 期 : 2015年11月30日
  279. 作 者 : WL
  280. 修改内容 : 新生成函数
  281. *****************************************************************************/
  282. void spl0601_start_pressure(spl0601_t *hdev)
  283. {
  284. spl0601_write(hdev, HW_ADR, 0x08, 0x01);
  285. }
  286. /*****************************************************************************
  287. 函 数 名 : spl0601_start_continuous
  288. 功能描述 : Select node for the continuously measurement
  289. 输入参数 : uint8_t mode 1: pressure; 2: temperature; 3: pressure and temperature
  290. 输出参数 : 无
  291. 返 回 值 :
  292. 调用函数 :
  293. 被调函数 :
  294. 修改历史 :
  295. 1.日 期 : 2015年11月25日
  296. 作 者 : WL
  297. 修改内容 : 新生成函数
  298. *****************************************************************************/
  299. void spl0601_start_continuous(spl0601_t *hdev, uint8_t mode)
  300. {
  301. spl0601_write(hdev, HW_ADR, 0x08, mode+4);
  302. }
  303. void spl0601_stop(spl0601_t *hdev)
  304. {
  305. spl0601_write(hdev, HW_ADR, 0x08, 0);
  306. }
  307. /*****************************************************************************
  308. 函 数 名 : spl0601_get_raw_temp
  309. 功能描述 : 获取温度的原始值,并转换成32Bits整数
  310. 输入参数 : void
  311. 输出参数 : 无
  312. 返 回 值 :
  313. 调用函数 :
  314. 被调函数 :
  315. 修改历史 :
  316. 1.日 期 : 2015年11月30日
  317. 作 者 : WL
  318. 修改内容 : 新生成函数
  319. *****************************************************************************/
  320. void spl0601_get_raw_temp(spl0601_t *hdev)
  321. {
  322. uint8_t buf[3], reg = 0x03;
  323. struct rt_i2c_msg msg;
  324. msg.addr = HW_ADR;
  325. msg.buf = &reg;
  326. msg.len = 1;
  327. msg.flags = RT_I2C_WR;
  328. rt_i2c_transfer(hdev->bus, &msg, 1);
  329. msg.buf = buf;
  330. msg.len = 3;
  331. msg.flags = RT_I2C_RD;
  332. rt_i2c_transfer(hdev->bus, &msg, 1);
  333. hdev->i32rawTemperature = (int32_t)buf[0]<<16 | (int32_t)buf[1]<<8 | (int32_t)buf[2];
  334. hdev->i32rawTemperature= (hdev->i32rawTemperature&0x800000) ? (0xFF000000|hdev->i32rawTemperature) : hdev->i32rawTemperature;
  335. }
  336. /*****************************************************************************
  337. 函 数 名 : spl0601_get_raw_pressure
  338. 功能描述 : 获取压力原始值,并转换成32bits整数
  339. 输入参数 : void
  340. 输出参数 : 无
  341. 返 回 值 :
  342. 调用函数 :
  343. 被调函数 :
  344. 修改历史 :
  345. 1.日 期 : 2015年11月30日
  346. 作 者 : WL
  347. 修改内容 : 新生成函数
  348. *****************************************************************************/
  349. void spl0601_get_raw_pressure(spl0601_t *hdev)
  350. {
  351. uint8_t buf[3], reg = 0x00;
  352. struct rt_i2c_msg msg;
  353. msg.addr = HW_ADR;
  354. msg.buf = &reg;
  355. msg.len = 1;
  356. msg.flags = RT_I2C_WR;
  357. rt_i2c_transfer(hdev->bus, &msg, 1);
  358. msg.buf = buf;
  359. msg.len = 3;
  360. msg.flags = RT_I2C_RD;
  361. rt_i2c_transfer(hdev->bus, &msg, 1);
  362. hdev->i32rawPressure = (int32_t)buf[0]<<16 | (int32_t)buf[1]<<8 | (int32_t)buf[2];
  363. hdev->i32rawPressure= (hdev->i32rawPressure&0x800000) ? (0xFF000000|hdev->i32rawPressure) : hdev->i32rawPressure;
  364. }
  365. /*****************************************************************************
  366. 函 数 名 : spl0601_get_temperature
  367. 功能描述 : 在获取原始值的基础上,返回浮点校准后的温度值
  368. 输入参数 : void
  369. 输出参数 : 无
  370. 返 回 值 :
  371. 调用函数 :
  372. 被调函数 :
  373. 修改历史 :
  374. 1.日 期 : 2015年11月30日
  375. 作 者 : WL
  376. 修改内容 : 新生成函数
  377. *****************************************************************************/
  378. float spl0601_get_temperature(spl0601_t *hdev)
  379. {
  380. float fTCompensate;
  381. float fTsc;
  382. fTsc = hdev->i32rawTemperature / (float)hdev->i32kT;
  383. fTCompensate = hdev->calib_param.c0 * 0.5 + hdev->calib_param.c1 * fTsc;
  384. return fTCompensate;
  385. }
  386. /*****************************************************************************
  387. 函 数 名 : spl0601_get_pressure
  388. 功能描述 : 在获取原始值的基础上,返回浮点校准后的压力值
  389. 输入参数 : void
  390. 输出参数 : 无
  391. 返 回 值 :
  392. 调用函数 :
  393. 被调函数 :
  394. 修改历史 :
  395. 1.日 期 : 2015年11月30日
  396. 作 者 : WL
  397. 修改内容 : 新生成函数
  398. *****************************************************************************/
  399. float spl0601_get_pressure(spl0601_t *hdev)
  400. {
  401. float fTsc, fPsc;
  402. float qua2, qua3;
  403. float fPCompensate;
  404. fTsc = hdev->i32rawTemperature / (float)hdev->i32kT;
  405. fPsc = hdev->i32rawPressure / (float)hdev->i32kP;
  406. qua2 = hdev->calib_param.c10 + fPsc * (hdev->calib_param.c20 + fPsc* hdev->calib_param.c30);
  407. qua3 = fTsc * fPsc * (hdev->calib_param.c11 + fPsc * hdev->calib_param.c21);
  408. fPCompensate = hdev->calib_param.c00 + fPsc * qua2 + fTsc * hdev->calib_param.c01 + qua3;
  409. return fPCompensate;
  410. }