max31865 SPI通信失败

2019-07-20 01:36发布

使用stm32f302读写MAX31865,初始化,无法读出数据,都是0xff。
尝试使用硬件SPI和GPIO模拟SPI,都无法读出。
感觉就是读写SPI,但是不知道为什么就不行。
有用示波器去量波形,感觉没什么问题。
有人使用过这个芯片吗?谢谢!

下面是代码:
u8 SPI_MAX31865_Init(void)
{
  
    SPI_InitTypeDef  SPI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
   
    RCC_APB1PeriphClockCmd(SPI_MAX31865_SPI_CLK, ENABLE);
   
    RCC_AHBPeriphClockCmd(SPI_MAX31865_SPI_MOSI_GPIO_CLK | SPI_MAX31865_SPI_MISO_GPIO_CLK |
                          SPI_MAX31865_SPI_SCK_GPIO_CLK,  ENABLE);
   
    RCC_APB1PeriphClockCmd(SPI_MAX31865_CS_GPIO_CLK, ENABLE);   
   
    /*!< Configure SPI_MAX31865_SPI_CS_PIN pin: SPI_MAX31865 Card CS pin */
    GPIO_InitStructure.GPIO_Pin = SPI_MAX31865_CS_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_Init(SPI_MAX31865_CS_GPIO_PORT, &GPIO_InitStructure);
    /* Deselect the MAX31865: Chip Select high */
    SPI_MAX31865_CS_HIGH();
   
    /*!< Configure SPI_MAX31865_SPI pins: SCK */   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
   
    /*!< Configure SPI_MAX31865_SPI pins: SCK */
    GPIO_InitStructure.GPIO_Pin = SPI_MAX31865_SPI_SCK_PIN;
    GPIO_Init(SPI_MAX31865_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
   
    /*!< Configure SPI_MAX31865_SPI pins: MISO */
    GPIO_InitStructure.GPIO_Pin = SPI_MAX31865_SPI_MISO_PIN;
    GPIO_Init(SPI_MAX31865_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
   
    /*!< Configure SPI_MAX31865_SPI pins: MOSI */
    GPIO_InitStructure.GPIO_Pin = SPI_MAX31865_SPI_MOSI_PIN;
    GPIO_Init(SPI_MAX31865_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
         
   
    /* Configure DRDS */
    RCC_AHBPeriphClockCmd(SPI_MAX31865_DR_GPIO_CLK, ENABLE);
   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;   
    GPIO_InitStructure.GPIO_Pin = SPI_MAX31865_DR_PIN;
    GPIO_Init(SPI_MAX31865_DR_GPIO_PORT, &GPIO_InitStructure);
   
   
    GPIO_PinAFConfig(SPI_MAX31865_SPI_SCK_GPIO_PORT, SPI_MAX31865_SPI_SCK_SOURCE, GPIO_AF_5);
    GPIO_PinAFConfig(SPI_MAX31865_SPI_MISO_GPIO_PORT, SPI_MAX31865_SPI_MISO_SOURCE, GPIO_AF_5);
    GPIO_PinAFConfig(SPI_MAX31865_SPI_MOSI_GPIO_PORT, SPI_MAX31865_SPI_MOSI_SOURCE, GPIO_AF_5);   
   
   
    /* SPI2 configuration */
    /* SPI ADS1118: data input on the DIO pin is sampled on the rising edge of the CLK.
    Data on the DO and DIO pins are clocked out on the falling edge of CLK.*/
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;      
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                                                               
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                                                                  
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                                                                        
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                                                                                 
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                                                                    
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;         
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                                                            
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI_MAX31865_SPI, &SPI_InitStructure);
    SPI_RxFIFOThresholdConfig(SPI_MAX31865_SPI, SPI_RxFIFOThreshold_QF);
   
    /* Enable SPI1  */
    SPI_Cmd(SPI_MAX31865_SPI, ENABLE);
   
    /* wait for MAX31865 to set up */
    delay_ms(200);
   
    u8 read_value = 0;
    while(read_value != 0xc2)
    {
        SPI_MAX31865_Write( 0x80,0xc2 );
        
        delay_us(50);
        
        read_value = SPI_MAX31865_Read(0x00);
        
        delay_ms(10);
        
    }
   
    return 1;
}

uint8_t sEE_SendByte(uint8_t value)
{
  /*!< Loop while DR register in not empty */
  while (SPI_I2S_GetFlagStatus(SPI_MAX31865_SPI, SPI_I2S_FLAG_TXE) == RESET);
  /*!< Send byte through the SPI peripheral */
  SPI_SendData8(SPI_MAX31865_SPI, value);
  
  /*!< Wait to receive a byte */
  while (SPI_I2S_GetFlagStatus(SPI_MAX31865_SPI, SPI_I2S_FLAG_RXNE) == RESET);
  /*!< Return the byte read from the SPI bus */
  return SPI_ReceiveData8(SPI_MAX31865_SPI);
}
void SPI_MAX31865_Write(u8 address, u8 value)         
{
    SPI_MAX31865_CS_LOW();   
    sEE_SendByte(address);                  
    sEE_SendByte(value);
    SPI_MAX31865_CS_HIGH();
}
uint8_t SPI_MAX31865_Read(u8 address)         
{
    u8 value = 0;
   
    SPI_MAX31865_CS_LOW();  
    sEE_SendByte(address);                  
    value = sEE_SendByte(0x00);   
    SPI_MAX31865_CS_HIGH();
   
    return value;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
oceane
1楼-- · 2019-07-20 22:23
 精彩回答 2  元偷偷看……
lison0103
2楼-- · 2019-07-21 02:19
 精彩回答 2  元偷偷看……
翌晨
3楼-- · 2019-07-21 03:15
lison0103 发表于 2018-3-21 14:15
代码我也找不到了,在以前公司做的。

和其他SPI设备一样,调通SPI通信就可以了。

我也遇到这个问题了,读取RTD一直返回FFFF,楼主是什么原因,怎么解决的?
sep
4楼-- · 2019-07-21 05:12
sin88 发表于 2016-12-20 20:36
顺便问下楼主,读出来的温度怎么知道和真实值差多少?反正现在感觉数值差不多,但究竟差了0.几度,就不知道 ...

亲,您好,我的代码有问题,经常出现故障,可否让我参考一下您的代码,看看我哪里出现了问题,不胜感激啊,谢谢!qq邮箱:761124311@qq.com
sep
5楼-- · 2019-07-21 09:07
 精彩回答 2  元偷偷看……
sep
6楼-- · 2019-07-21 14:29
 精彩回答 2  元偷偷看……

一周热门 更多>