最近研究maxim max31865溫度傳感器,貼出通信驅動代碼和大牛門一起學習,指點我一二
max31865是專門用來測量電阻類溫度傳感器的,ad分辨率為15位,可以做PT100高精度測量,通信接口為SPI。
通過評估板CN7的PC10,PC11,PC12 (SPI3)連接芯片模塊,PD2做片選。
下面貼上驅動代碼:
1. ////////////////////////////////////////////////////////////////////////////////// 2. ////////////////////////////////////////////////////////////////////////////////// 3. 4. SPI_HandleTypeDef SPI3_Handler; 5. 6. void SPI3_Init(void) 7. { 8. SPI3_Handler.Instance=SPI3; //SP3 9. SPI3_Handler.Init.Mode=SPI_MODE_MASTER; //設置SPI工作模式,設置為主模式 10. SPI3_Handler.Init.Direction=SPI_DIRECTION_2LINES; //設置SPI單向或者雙向的數據模式:SPI設置為雙線模式 11. SPI3_Handler.Init.DataSize=SPI_DATASIZE_8BIT; //設置SPI的數據大小:SPI發送接收8位幀結構 12. SPI3_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH; //串行同步時鐘的空閑狀態為高電平 13. SPI3_Handler.Init.CLKPhase=SPI_PHASE_2EDGE; //串行同步時鐘的第二個跳變沿(上升或下降)數據被采樣 14. SPI3_Handler.Init.NSS=SPI_NSS_SOFT; //NSS信號由硬件(NSS管腳)還是軟件(使用SSI位)管理:內部NSS信號有SSI位控制 15. SPI3_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256;//定義波特率預分頻的值:波特率預分頻值為256 16. SPI3_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB; //指定數據傳輸從MSB位還是LSB位開始:數據傳輸從MSB位開始 17. SPI3_Handler.Init.TIMode=SPI_TIMODE_DISABLE; //關閉TI模式 18. SPI3_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//關閉硬件CRC校驗 19. SPI3_Handler.Init.CRCPolynomial=7; //CRC值計算的多項式 20. HAL_SPI_Init(&SPI3_Handler);//初始化 21. 22. __HAL_SPI_ENABLE(&SPI3_Handler); //使能SPI3 23. 24. SPI3_ReadWriteByte(0Xff); //啟動傳輸 25.} 26. 27.void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) 28.{ 29. GPIO_InitTypeDef GPIO_InitStruct; 30. /* USER CODE BEGIN SPI3_MspInit 0 */ 31. 32. /* USER CODE END SPI3_MspInit 0 */ 33. /* Peripheral clock enable */ 34. __HAL_RCC_SPI3_CLK_ENABLE(); 35. 36. /**SPI3 GPIO Configuration 37. PC10 ------> SPI3_SCK 38. PC11 ------> SPI3_MISO 39. PC12 ------> SPI3_MOSI 40. */ 41. GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12; 42. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; 43. GPIO_InitStruct.Pull = GPIO_NOPULL; 44. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; 45. GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; 46. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); 47.} 48. 49.void SPI3_SetSpeed(u8 SPI_BaudRatePrescaler) 50.{ 51. assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判斷有效性 52. __HAL_SPI_DISABLE(&SPI3_Handler); //關閉SPI 53. SPI3_Handler.Instance->CR1&=0XFFC7; //位3-5清零,用來設置波特率 54. SPI3_Handler.Instance->CR1|=SPI_BaudRatePrescaler;//設置SPI速度 55. __HAL_SPI_ENABLE(&SPI3_Handler); //使能SPI 56. 57.} 58. 59.u8 SPI3_ReadWriteByte(u8 TxData) 60.{ 61. u8 Rxdata; 62. HAL_SPI_TransmitReceive(&SPI3_Handler,&TxData,&Rxdata,1, 1000); 63. return Rxdata; //返回收到的數據 64.} 65. 66. 67.#define MAX31865_CFG 0x00 68.#define MAX31865_RTD_MSB 0x01 69.#define MAX31865_RTD_LSB 0x02 70.#define MAX31865_HIGH_MSB 0x03 71.#define MAX31865_HIGH_LSB 0x04 72.#define MAX31865_LOW_MSB 0x05 73.#define MAX31865_LOW_LSB 0x06 74.#define MAX31865_FAULT 0x07 75. 76.////////////////////////////////////////////////////////////////////////////////// 77.// 模塊特征 78.// 連續轉換大約每次轉換大約21ms 79.// 單次轉換每次大約52ms(60HZ濾波) 62ms(50HZ濾波) 80.////////////////////////////////////////////////////////////////////////////////// 81. 82.#define SpiRw(x) SPI3_ReadWriteByte(x) 83. 84.#define max31865_enable() PT_SS=0 85.#define max31865_disable() PT_SS=1 86. 87./*****************************************************************************//*! 88.* @brief max38165 data read. 89.* 90.* @param none 91.* 92.* @return none 93.* 94.* @ Pass/ Fail criteria: none 95.*****************************************************************************/ 96.uint8_t max31865_read(uint8_t addr){ 97. 98. uint8_t Src[2]; 99. uint8_t Des[2]; 100. 101. max31865_disable(); 102. NOP20(); 103. max31865_enable(); 104. NOP20(); 105. 106. Src[0] = addr; 107. Src[1] = 0xFF; 108. 109. Des[0] = SpiRw(Src[0]); 110. Des[1] = SpiRw(Src[1]); 111. 112. max31865_disable(); 113. 114. return Des[1]; 115. } 116. 117. 118. /*****************************************************************************//*! 119. * @brief max38165 data wrire. 120. * 121. * @param none 122. * 123. * @return none 124. * 125. * @ Pass/ Fail criteria: none 126. *****************************************************************************/ 127. uint8_t max31865_write(uint8_t addr, uint8_t data){ 128. uint8_t Src[2]; 129. uint8_t Des[2]; 130. 131. max31865_disable(); 132. NOP20(); 133. max31865_enable(); 134. NOP20(); 135. 136. Src[0] = addr; 137. Src[1] = data; 138. 139. Des[0] = SpiRw(Src[0]); 140. Des[1] = SpiRw(Src[1]); 141. 142. max31865_disable(); 143. 144. return Des[1]; 145. } 146. 147. /*****************************************************************************//*! 148. * @brief max38165 config. 149. * 150. * @param none 151. * 152. * @return none 153. * 154. * @ Pass/ Fail criteria: none 155. *****************************************************************************/ 156. uint8_t max31865_Cfg(uint8_t cfg){ 157. uint8_t cfgR; 158. 159. for(uint8_t faultCnt = 0;faultCnt<3;faultCnt++){ 160. max31865_write(MAX31865_CFG|0x80, cfg); //寫入配置 161. cfgR = max31865_read(MAX31865_CFG); //讀回配置 162. if((cfgR & 0xDD) == (cfg & 0xDD)){ 163. cfgR &= 0xDD; 164. break; 165. } 166. } 167. return cfgR; 168. } 169. 170. /*****************************************************************************//*! 171. * @brief max38165 rdt read. 172. * 173. * @param none 174. * 175. * @return none 176. * 177. * @ Pass/ Fail criteria: none 178. *****************************************************************************/ 179. uint16_t max31865_rtd_read(void){ 180. uint16_t res; 181. 182. res = max31865_read(MAX31865_RTD_LSB); 183. res<<=8; 184. res |= max31865_read(MAX31865_RTD_MSB); 185. 186. return (res>>1); 187. } 188. 189. /*****************************************************************************//*! 190. * @brief max38165 high val set. 191. * 192. * @param none 193. * 194. * @return none 195. * 196. * @ Pass/ Fail criteria: none 197. *****************************************************************************/ 198. uint16_t max31865_high_set(uint16_t val){ 199. uint8_t dr,dw; 200. uint16_t fault; 201. 202. fault = val; 203. 204. dw = val & 0xFF; 205. for(uint8_t faultCnt = 0;faultCnt<5;faultCnt++){ 206. max31865_write(MAX31865_HIGH_LSB|0x80, dw); //寫入配置
|