標(biāo)題: max31865溫度傳感器通信驅(qū)動代碼 [打印本頁]
作者: QQ820270087 時(shí)間: 2020-2-19 22:44
標(biāo)題: max31865溫度傳感器通信驅(qū)動代碼
最近研究maxim max31865溫度傳感器,貼出通信驅(qū)動代碼和大牛門一起學(xué)習(xí),指點(diǎn)我一二
max31865是專門用來測量電阻類溫度傳感器的,ad分辨率為15位,可以做PT100高精度測量,通信接口為SPI。
通過評估板CN7的PC10,PC11,PC12 (SPI3)連接芯片模塊,PD2做片選。
下面貼上驅(qū)動代碼:
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; //設(shè)置SPI工作模式,設(shè)置為主模式
10. SPI3_Handler.Init.Direction=SPI_DIRECTION_2LINES; //設(shè)置SPI單向或者雙向的數(shù)據(jù)模式:SPI設(shè)置為雙線模式
11. SPI3_Handler.Init.DataSize=SPI_DATASIZE_8BIT; //設(shè)置SPI的數(shù)據(jù)大小:SPI發(fā)送接收8位幀結(jié)構(gòu)
12. SPI3_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH; //串行同步時(shí)鐘的空閑狀態(tài)為高電平
13. SPI3_Handler.Init.CLKPhase=SPI_PHASE_2EDGE; //串行同步時(shí)鐘的第二個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣
14. SPI3_Handler.Init.NSS=SPI_NSS_SOFT; //NSS信號由硬件(NSS管腳)還是軟件(使用SSI位)管理:內(nèi)部NSS信號有SSI位控制
15. SPI3_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256;//定義波特率預(yù)分頻的值:波特率預(yù)分頻值為256
16. SPI3_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB; //指定數(shù)據(jù)傳輸從MSB位還是LSB位開始:數(shù)據(jù)傳輸從MSB位開始
17. SPI3_Handler.Init.TIMode=SPI_TIMODE_DISABLE; //關(guān)閉TI模式
18. SPI3_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//關(guān)閉硬件CRC校驗(yàn)
19. SPI3_Handler.Init.CRCPolynomial=7; //CRC值計(jì)算的多項(xiàng)式
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); //關(guān)閉SPI
53. SPI3_Handler.Instance->CR1&=0XFFC7; //位3-5清零,用來設(shè)置波特率
54. SPI3_Handler.Instance->CR1|=SPI_BaudRatePrescaler;//設(shè)置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; //返回收到的數(shù)據(jù)
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.// 連續(xù)轉(zhuǎn)換大約每次轉(zhuǎn)換大約21ms
79.// 單次轉(zhuǎn)換每次大約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); //寫入配置
作者: carryonli 時(shí)間: 2021-5-17 13:21
代碼不全阿.
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |