最近研究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); //写入配置
|