OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3401|回复: 2

MAX31865读取寄存器数据失败求助

[复制链接]

1

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2020-11-20
在线时间
3 小时
发表于 2020-11-25 20:10:19 | 显示全部楼层 |阅读模式
1金钱
买了一个MAX31865的模块如下图所示:采用了两线接法,如下图所示:



找了一下网上的标准代码,但是始终读取的温度是988.922,我尝试了拿掉热敏电阻pt1000,数值不变。
我把找到的代码贴出来,请大佬帮忙看一下,指点一下问题在哪里
/* MAX31865参考电阻PT100是430欧,PT1000是4.3k */
#define RREF  4300  //400Ω

#define MAX31865_CONTROL_PORT GPIOA

#define MAX31865_DRDY GPIO_Pin_3  //A3,随便接的

#define MAX31865_CS GPIO_Pin_4   //SPI1_CS_A4
#define MAX31865_SCLK GPIO_Pin_5 //SPI1_CLK_A5
#define MAX31865_SDI GPIO_Pin_6  //SPI1_MOSI_A6,主发客收接传感器SDI
#define MAX31865_SDO GPIO_Pin_7 //SPI1_MISO_A7,主收客发接传感器SDO

#define MAX31865_CS_SET GPIO_SetBits(MAX31865_CONTROL_PORT,MAX31865_CS)
#define MAX31865_CS_CLR GPIO_ResetBits(MAX31865_CONTROL_PORT,MAX31865_CS)

#define MAX31865_SCLK_SET  GPIO_SetBits(MAX31865_CONTROL_PORT,MAX31865_SCLK)
#define MAX31865_SCLK_CLR  GPIO_ResetBits(MAX31865_CONTROL_PORT,MAX31865_SCLK)

#define MAX31865_SDI_SET GPIO_SetBits(MAX31865_CONTROL_PORT,MAX31865_SDI)
#define MAX31865_SDI_CLR  GPIO_ResetBits(MAX31865_CONTROL_PORT,MAX31865_SDI)

#define MAX31865_DRDY_SET GPIO_SetBits(MAX31865_CONTROL_PORT,MAX31865_DRDY)
#define MAX31865_DRDY_CLR  GPIO_ResetBits(MAX31865_CONTROL_PORT,MAX31865_DRDY)

#define MAX31865_SDO_READ    GPIO_ReadInputDataBit(MAX31865_CONTROL_PORT,MAX31865_SDO)
#define MAX31865_DRDY_READ   GPIO_ReadInputDataBit(MAX31865_CONTROL_PORT,MAX31865_DRDY)

void MAX31865_Init(void)
{

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2020-11-20
在线时间
3 小时
 楼主| 发表于 2020-11-25 20:12:27 | 显示全部楼层


void MAX31865_Init(void)
{
        SPI_InitTypeDef SPI_Inistructure;
        GPIO_InitTypeDef GPIO_InitStructure ;
       
        //接线在GPIOA上,CS/SS接A4主要是片选信号主机控制从机,SCLK是串行时钟信号A5,SDI输入信号A6,SDO输出信号A7,DRAY为存储查询信号A3
        //使能A口时钟及SPI1时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1ENABLE);
  //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关掉JTAG,不关SW
       
        //PA4、PA5、PA6、PA7端口可以复用重映像为SPI的CS、SCK、MISO、MOSI,只需要将这四个端口配置为复用推挽输出GPIO_Mode_AF_PP
        GPIO_InitStructure.GPIO_Pin = MAX31865_CS|MAX31865_SCLK|MAX31865_SDI;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(MAX31865_CONTROL_PORT,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = MAX31865_SDO|MAX31865_DRDY;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(MAX31865_CONTROL_PORT,&GPIO_InitStructure);
       
        MAX31865_CS_SET;
        MAX31865_SCLK_SET;

        /*SPI1配置,关于这个怎么配置见STM32的手册,为什么这样配置见后续内容*/
        //SPI_Inistructure.SPI_Direction=SPI_Direction_1Line_Tx;//主发送
        //SPI_Inistructure.SPI_Mode=SPI_Mode_Master;//主机模式
        //SPI_Inistructure.SPI_DataSize=SPI_DataSize_8b;//数据长度为8位
        //SPI_Inistructure.SPI_CPOL=SPI_CPOL_High;
        //两个脉冲沿做如下设置
        //SPI_Inistructure.SPI_CPHA=SPI_CPHA_2Edge;
        //SPI_Inistructure.SPI_NSS=SPI_NSS_Soft;//外部软件片选
        //SPI_Inistructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4; //4比较合适
        //SPI_Inistructure.SPI_FirstBit=SPI_FirstBit_MSB;//第1位为高位
        //SPI_Init(SPI1,&SPI_Inistructure);//SPI1设置
        //SPI_Cmd(SPI1,ENABLE);//SPI1使能
       
}

/* MAX31865 写寄存器
addr:寄存器地址
data:数据
*/
void MAX31865_Write(unsigned char addr, unsigned char data)
{
        unsigned char i;
       
        MAX31865_CS_CLR;
        for(i=0;i<8;i++)  //写地址
        {
                MAX31865_SCLK_CLR;
                if(addr&0x80) MAX31865_SDI_SET;
                else MAX31865_SDI_CLR;
                MAX31865_SCLK_SET;
                addr<<=1;
        }
        for(i=0;i<8;i++)  //写数据
        {
                MAX31865_SCLK_CLR;
                if(data&0x80) MAX31865_SDI_SET;
                else MAX31865_SDI_CLR;
                MAX31865_SCLK_SET;
                data<<=1;
        }
        MAX31865_CS_SET;
       
}

/* MAX31865 读寄存器
addr:寄存器地址
*/
unsigned char MAX31865_Read(unsigned char addr)
{
        unsigned char i;
        unsigned char data=0;
       
        MAX31865_CS_CLR;
        for(i=0;i<8;i++)  //写地址
        {
                MAX31865_SCLK_CLR;
                if(addr&0x80) MAX31865_SDI_SET;
                else MAX31865_SDI_CLR;
                MAX31865_SCLK_SET;
                addr<<=1;
        }
        for(i=0;i<8;i++)  //读数据
        {
                MAX31865_SCLK_CLR;
                data<<=1;               
                MAX31865_SCLK_SET;               
                if(MAX31865_SDO_READ) data|=0x01;
                else data|=0x00;
        }
        MAX31865_CS_SET;
        return data;

}

/* MAX31865 配置*/
void MAX31865_Cfg(void)
{
         //MAX31865_Write(0x80, 0xC3); //BIAS ON,自动,4线,50HZ  根据文件修改四线还是三线
          MAX31865_Write(0x80,0xC1);//二线、四线配置
  //MAX31865_Write(0x80,0xD1);//三线配置
}

/* MAX31865 PT1000获取温度 */
float Get_tempture_pt1000(void)
        //PT1000
{
        unsigned int data;
        float Rt;
        float Rt0 = 1000;  //PT100为100,PT1000为1000
        float Z1,Z2,Z3,Z4,temp;
        float a = 3.9083e-3;
        float b = -5.775e-7;
        float rpoly;

//        MAX31865_Write(0x80, 0xD3);
        data=MAX31865_Read(0x01)<<8;
        data|=MAX31865_Read(0x02);
        data>>=1;  //去掉Fault位
        //printf("Read=0x%02X\r\n",data);
        Rt=(float)data/32768.0*RREF;
       
        //printf("Rt=0x%.1f\r\n",Rt);
       
        Z1 = -a;
  Z2 = a*a-4*b;
  Z3 = 4*b/Rt0;
  Z4 = 2*b;

  temp = Z2+Z3*Rt;
  temp = (sqrt(temp)+Z1)/Z4;
  
  if(temp>=0) return temp;

  rpoly = Rt;
  temp = -242.02;
  temp += 2.2228 * rpoly;
  rpoly *= Rt;  // square
  temp += 2.5859e-3 * rpoly;
  rpoly *= Rt;  // ^3
  temp -= 4.8260e-6 * rpoly;
  rpoly *= Rt;  // ^4
  temp -= 2.8183e-8 * rpoly;
  rpoly *= Rt;  // ^5
  temp += 1.5243e-10 * rpoly;

  return temp;
}
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2020-11-20
在线时间
3 小时
 楼主| 发表于 2020-11-25 20:15:06 | 显示全部楼层
main()
{    //初始化测温装置
                MAX31865_Init();
                MAX31865_Cfg();
                //printf("MAX31865 test\r\n");
                delay_ms(50);
           while(1){
                           //测温结果
                          temp=Get_tempture_pt1000();
                         printf("temp=%.3f\r\n",temp);
      }               
}
SPI时钟例程里没有开启就关了,试过开启也没有用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 21:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表