max31865C语言程序,max31865温度传感器通信驱动代码
最近研究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);??//寫入配置
總結
以上是生活随笔為你收集整理的max31865C语言程序,max31865温度传感器通信驱动代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 的run窗口不显示_「玩转deepin」
- 下一篇: 【算法设计与分析】16 分治策略:快速排