max31865温度传感器通信
max31865是专门用来测量电阻类温度传感器的,ad分辨率为15位,可以做PT100高精度测量,通信接口为SPI。
通过评估板CN7的PC10,PC11,PC12 (SPI3)连接 芯片模块,PD2做片选。
下面贴上驱动代码:
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
SPI_HandleTypeDef SPI3_Handler;
void SPI3_Init(void)
{
SPI3_Handler.Instance=SPI3; //SP3
SPI3_Handler.Init.Mode=SPI_MODE_MASTER; //设置SPI工作模式,设置为主模式
SPI3_Handler.Init.Direction=SPI_DIRECTION_2LINES; //设置SPI单向或者双向的数据模式:SPI设置为双线模式
SPI3_Handler.Init.DataSize=SPI_DATASIZE_8BIT; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI3_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH; //串行同步时钟的空闲状态为高电平
SPI3_Handler.Init.CLKPhase=SPI_PHASE_2EDGE; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI3_Handler.Init.NSS=SPI_NSS_SOFT; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI3_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256;//定义波特率预分频的值:波特率预分频值为256
SPI3_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI3_Handler.Init.TIMode=SPI_TIMODE_DISABLE; //关闭TI模式
SPI3_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
SPI3_Handler.Init.CRCPolynomial=7; //CRC值计算的多项式
HAL_SPI_Init(&SPI3_Handler);//初始化
__HAL_SPI_ENABLE(&SPI3_Handler); //使能SPI3
SPI3_ReadWriteByte(0Xff); //启动传输
}
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* USER CODE BEGIN SPI3_MspInit 0 */
/* USER CODE END SPI3_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_SPI3_CLK_ENABLE();
/**SPI3 GPIO Configuration
PC10 ------> SPI3_SCK
PC11 ------> SPI3_MISO
PC12 ------> SPI3_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
void SPI3_SetSpeed(u8 SPI_BaudRatePrescaler)
{
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判断有效性
__HAL_SPI_DISABLE(&SPI3_Handler); //关闭SPI
SPI3_Handler.Instance->CR1&=0XFFC7; //位3-5清零,用来设置波特率
SPI3_Handler.Instance->CR1|=SPI_BaudRatePrescaler;//设置SPI速度
__HAL_SPI_ENABLE(&SPI3_Handler); //使能SPI
}
u8 SPI3_ReadWriteByte(u8 TxData)
{
u8 Rxdata;
HAL_SPI_TransmitReceive(&SPI3_Handler,&TxData,&Rxdata,1, 1000);
return Rxdata; //返回收到的数据
}
#define MAX31865_CFG 0x00
#define MAX31865_RTD_MSB 0x01
#define MAX31865_RTD_LSB 0x02
#define MAX31865_HIGH_MSB 0x03
#define MAX31865_HIGH_LSB 0x04
#define MAX31865_LOW_MSB 0x05
#define MAX31865_LOW_LSB 0x06
#define MAX31865_FAULT 0x07
//////////////////////////////////////////////////////////////////////////////////
// 模块特征
// 连续转换大约 每次转换大约21ms
// 单次转换 每次大约 52ms(60HZ滤波) 62ms(50HZ滤波)
//////////////////////////////////////////////////////////////////////////////////
#define SpiRw(x) SPI3_ReadWriteByte(x)
#define max31865_enable() PT_SS=0
#define max31865_disable() PT_SS=1
/*****************************************************************************//*!
* @brief max38165 data read.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint8_t max31865_read(uint8_t addr){
uint8_t Src;
uint8_t Des;
max31865_disable();
NOP20();
max31865_enable();
NOP20();
Src = addr;
Src = 0xFF;
Des = SpiRw(Src);
Des = SpiRw(Src);
max31865_disable();
return Des;
}
/*****************************************************************************//*!
* @brief max38165 data wrire.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint8_t max31865_write(uint8_t addr, uint8_t data){
uint8_t Src;
uint8_t Des;
max31865_disable();
NOP20();
max31865_enable();
NOP20();
Src = addr;
Src = data;
Des = SpiRw(Src);
Des = SpiRw(Src);
max31865_disable();
return Des;
}
/*****************************************************************************//*!
* @brief max38165 config.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint8_t max31865_Cfg(uint8_t cfg){
uint8_t cfgR;
for(uint8_t faultCnt = 0;faultCnt<3;faultCnt++){
max31865_write(MAX31865_CFG|0x80, cfg); //写入配置
cfgR = max31865_read(MAX31865_CFG); //读回配置
if((cfgR & 0xDD) == (cfg & 0xDD)){
cfgR &= 0xDD;
break;
}
}
return cfgR;
}
/*****************************************************************************//*!
* @brief max38165 rdt read.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint16_t max31865_rtd_read(void){
uint16_t res;
res = max31865_read(MAX31865_RTD_LSB);
res<<=8;
res |= max31865_read(MAX31865_RTD_MSB);
return (res>>1);
}
/*****************************************************************************//*!
* @brief max38165 high val set.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint16_t max31865_high_set(uint16_t val){
uint8_t dr,dw;
uint16_t fault;
fault = val;
dw = val & 0xFF;
for(uint8_t faultCnt = 0;faultCnt<5;faultCnt++){
max31865_write(MAX31865_HIGH_LSB|0x80, dw); //写入配置
dr = max31865_read(MAX31865_HIGH_LSB); //读回配置
if(dr == dw){
fault &= 0xFF00;
break;
}
}
dw = (val>>8) & 0xFF;
for(uint8_t faultCnt = 0;faultCnt<5;faultCnt++){
max31865_write(MAX31865_HIGH_MSB|0x80, dw); //写入配置
dr = max31865_read(MAX31865_HIGH_MSB); //读回配置
if(dr == dw){
fault &= 0x00FF;
break;
}
}
return fault;
}
/*****************************************************************************//*!
* @brief max38165 low val set.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint16_t max31865_low_set(uint16_t val){
uint8_t dr,dw;
uint16_t fault;
fault = val;
dw = val & 0xFF;
for(uint8_t faultCnt = 0;faultCnt<5;faultCnt++){
max31865_write(MAX31865_LOW_LSB|0x80, dw); //写入配置
dr = max31865_read(MAX31865_LOW_LSB); //读回配置
if(dr == dw){
fault &= 0xFF00;
break;
}
}
dw = (val>>8) & 0xFF;
for(uint8_t faultCnt = 0;faultCnt<5;faultCnt++){
max31865_write(MAX31865_LOW_MSB|0x80, dw); //写入配置
dr = max31865_read(MAX31865_LOW_MSB); //读回配置
if(dr == dw){
fault &= 0x00FF;
break;
}
}
return fault;
}
/*****************************************************************************//*!
* @brief max38165 fault read.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint8_t max31865_fault_read(void){
return max31865_read(MAX31865_FAULT);
}
然后可以通过调用 max31865_Cfg(0xB3);进行一次转换,调用max31865_rtd_read()可以读取转换数据;
max31865温度传感器通信
max31865是专门用来测量电阻类温度传感器的,ad分辨率为15位,可以做PT100高精度测量,通信接口为SPI。
通过评估板CN7的PC10,PC11,PC12 (SPI3)连接 芯片模块,PD2做片选。
下面贴上驱动代码:
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
SPI_HandleTypeDef SPI3_Handler;
void SPI3_Init(void)
{
SPI3_Handler.Instance=SPI3; //SP3
SPI3_Handler.Init.Mode=SPI_MODE_MASTER; //设置SPI工作模式,设置为主模式
SPI3_Handler.Init.Direction=SPI_DIRECTION_2LINES; //设置SPI单向或者双向的数据模式:SPI设置为双线模式
SPI3_Handler.Init.DataSize=SPI_DATASIZE_8BIT; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI3_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH; //串行同步时钟的空闲状态为高电平
SPI3_Handler.Init.CLKPhase=SPI_PHASE_2EDGE; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI3_Handler.Init.NSS=SPI_NSS_SOFT; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI3_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256;//定义波特率预分频的值:波特率预分频值为256
SPI3_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI3_Handler.Init.TIMode=SPI_TIMODE_DISABLE; //关闭TI模式
SPI3_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
SPI3_Handler.Init.CRCPolynomial=7; //CRC值计算的多项式
HAL_SPI_Init(&SPI3_Handler);//初始化
__HAL_SPI_ENABLE(&SPI3_Handler); //使能SPI3
SPI3_ReadWriteByte(0Xff); //启动传输
}
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* USER CODE BEGIN SPI3_MspInit 0 */
/* USER CODE END SPI3_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_SPI3_CLK_ENABLE();
/**SPI3 GPIO Configuration
PC10 ------> SPI3_SCK
PC11 ------> SPI3_MISO
PC12 ------> SPI3_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
void SPI3_SetSpeed(u8 SPI_BaudRatePrescaler)
{
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判断有效性
__HAL_SPI_DISABLE(&SPI3_Handler); //关闭SPI
SPI3_Handler.Instance->CR1&=0XFFC7; //位3-5清零,用来设置波特率
SPI3_Handler.Instance->CR1|=SPI_BaudRatePrescaler;//设置SPI速度
__HAL_SPI_ENABLE(&SPI3_Handler); //使能SPI
}
u8 SPI3_ReadWriteByte(u8 TxData)
{
u8 Rxdata;
HAL_SPI_TransmitReceive(&SPI3_Handler,&TxData,&Rxdata,1, 1000);
return Rxdata; //返回收到的数据
}
#define MAX31865_CFG 0x00
#define MAX31865_RTD_MSB 0x01
#define MAX31865_RTD_LSB 0x02
#define MAX31865_HIGH_MSB 0x03
#define MAX31865_HIGH_LSB 0x04
#define MAX31865_LOW_MSB 0x05
#define MAX31865_LOW_LSB 0x06
#define MAX31865_FAULT 0x07
//////////////////////////////////////////////////////////////////////////////////
// 模块特征
// 连续转换大约 每次转换大约21ms
// 单次转换 每次大约 52ms(60HZ滤波) 62ms(50HZ滤波)
//////////////////////////////////////////////////////////////////////////////////
#define SpiRw(x) SPI3_ReadWriteByte(x)
#define max31865_enable() PT_SS=0
#define max31865_disable() PT_SS=1
/*****************************************************************************//*!
* @brief max38165 data read.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint8_t max31865_read(uint8_t addr){
uint8_t Src;
uint8_t Des;
max31865_disable();
NOP20();
max31865_enable();
NOP20();
Src = addr;
Src = 0xFF;
Des = SpiRw(Src);
Des = SpiRw(Src);
max31865_disable();
return Des;
}
/*****************************************************************************//*!
* @brief max38165 data wrire.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint8_t max31865_write(uint8_t addr, uint8_t data){
uint8_t Src;
uint8_t Des;
max31865_disable();
NOP20();
max31865_enable();
NOP20();
Src = addr;
Src = data;
Des = SpiRw(Src);
Des = SpiRw(Src);
max31865_disable();
return Des;
}
/*****************************************************************************//*!
* @brief max38165 config.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint8_t max31865_Cfg(uint8_t cfg){
uint8_t cfgR;
for(uint8_t faultCnt = 0;faultCnt<3;faultCnt++){
max31865_write(MAX31865_CFG|0x80, cfg); //写入配置
cfgR = max31865_read(MAX31865_CFG); //读回配置
if((cfgR & 0xDD) == (cfg & 0xDD)){
cfgR &= 0xDD;
break;
}
}
return cfgR;
}
/*****************************************************************************//*!
* @brief max38165 rdt read.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint16_t max31865_rtd_read(void){
uint16_t res;
res = max31865_read(MAX31865_RTD_LSB);
res<<=8;
res |= max31865_read(MAX31865_RTD_MSB);
return (res>>1);
}
/*****************************************************************************//*!
* @brief max38165 high val set.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint16_t max31865_high_set(uint16_t val){
uint8_t dr,dw;
uint16_t fault;
fault = val;
dw = val & 0xFF;
for(uint8_t faultCnt = 0;faultCnt<5;faultCnt++){
max31865_write(MAX31865_HIGH_LSB|0x80, dw); //写入配置
dr = max31865_read(MAX31865_HIGH_LSB); //读回配置
if(dr == dw){
fault &= 0xFF00;
break;
}
}
dw = (val>>8) & 0xFF;
for(uint8_t faultCnt = 0;faultCnt<5;faultCnt++){
max31865_write(MAX31865_HIGH_MSB|0x80, dw); //写入配置
dr = max31865_read(MAX31865_HIGH_MSB); //读回配置
if(dr == dw){
fault &= 0x00FF;
break;
}
}
return fault;
}
/*****************************************************************************//*!
* @brief max38165 low val set.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint16_t max31865_low_set(uint16_t val){
uint8_t dr,dw;
uint16_t fault;
fault = val;
dw = val & 0xFF;
for(uint8_t faultCnt = 0;faultCnt<5;faultCnt++){
max31865_write(MAX31865_LOW_LSB|0x80, dw); //写入配置
dr = max31865_read(MAX31865_LOW_LSB); //读回配置
if(dr == dw){
fault &= 0xFF00;
break;
}
}
dw = (val>>8) & 0xFF;
for(uint8_t faultCnt = 0;faultCnt<5;faultCnt++){
max31865_write(MAX31865_LOW_MSB|0x80, dw); //写入配置
dr = max31865_read(MAX31865_LOW_MSB); //读回配置
if(dr == dw){
fault &= 0x00FF;
break;
}
}
return fault;
}
/*****************************************************************************//*!
* @brief max38165 fault read.
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint8_t max31865_fault_read(void){
return max31865_read(MAX31865_FAULT);
}
然后可以通过调用 max31865_Cfg(0xB3);进行一次转换,调用max31865_rtd_read()可以读取转换数据;