【NUCLEO-F446RE开发板试用体验】+max31865温度传感器通信

  • apleilx
  • LV5工程师
  • |      2018-04-10 19:15:29
  • 浏览量 1766
  • 回复:0
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()可以读取转换数据;
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子