传感技术
直播中

h1654155216.2146

10年用户 106经验值
擅长:控制/MCU
私信 关注
[问答]

stm32用模拟SPI的方式操作热电偶传感器(max6675)

         最近在项目中用到了热电偶测量温度,选用了处理芯片max6675,它的通信方式是SPI,调试之初先用STM32的硬件SPI方式对其进行了调试,测得的温度值较为准确,但是由于在项目中要同时测量四路温度,而max6675只能处理一路热电偶值,于是想到了用软件模拟SPI的方式读取温度值,但是读取得温度值一直不对(不变或偏的离谱),麻烦用过这个芯片的朋友和路过的大神帮忙看看,万分感谢!!!
        以下是stm32用模拟SPI的方式来读取温度的程序:
        //SPI SCK引脚
        #define  SPI_CLK_GPIO   GPIOE
        #define  SPI_CLK_PIN    GPIO_Pin_6
       //SPI  数据引脚
       #define  SPI_MISO_GPIO   GPIOE
       #define  SPI_MISO_PIN    GPIO_Pin_5
       //SPI 片选信号引脚
       #define  SPI_CS_GPIO           GPIOE
       #define  SPI_CS_PIN              GPIO_Pin_4

      #define  MAX6675_CSL()       GPIO_ResetBits(SPI_CS_GPIO, SPI_CS_PIN)
      #define  MAX6675_CSH()      GPIO_SetBits(SPI_CLK_GPIO, SPI_CLK_PIN)
      #define  SPI_CLK_L                 GPIO_ResetBits(SPI_CLK_GPIO, SPI_CLK_PIN)   
      #define  SPI_CLK_H                GPIO_SetBits(SPI_CLK_GPIO, SPI_CLK_PIN)     
      #define  SPI_SDO                   GPIO_ReadInputDataBit(SPI_MISO_GPIO, SPI_MISO_PIN)

     unsigned int   Temperature_Spi_Read(void)
     {
           unsigned int j;
           unsigned char i;
            j = 0;
            MAX6675_CSL();
           for (i = 0; i < 16; i++)
          {
              SPI_CLK_H;
              j = (j <<1);
             if ( SPI_SDO==1)     
             j = j | 0x01;  
            SPI_CLK_L;         
           __nop();
           }
           MAX6675_CSH();
           return j;      
      }
     void SPI_MAX6675_Init(void)
     {
          GPIO_InitTypeDef GPIO_InitStructure;
          SPI_InitTypeDef  SPI_InitStructure;
         //使能时钟                  
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // 推挽输出
          GPIO_Init(GPIOE, &GPIO_InitStructure);

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入
          GPIO_Init(GPIOE, &GPIO_InitStructure);  
           
          MAX6675_CSH();//拉高CS
          SPI_CLK_L;  //置低SCK
     }
     int main (void)
     {
           unsigned int t,i;
           unsigned char c;
            unsigned char flag;
           float temprature;
           /*系统时钟72M */
           SystemInit();
  
           /* MAX6675  初始化*/
           SPI_MAX6675_Init();
           USART1_Config();
          while(1)
           {
                i=Temperature_Spi_Read();
               flag = i&0x04;      //flag保存了热电偶的链接状态
               t = i<<1;
               t = t>>4;
                temprature = t*0.25;
               if(i!=0)       //max6675有数据返回
               {
                     if(flag==0)      //热电偶已连接
                     {
                           printf("当前温度是%4.2f¡£rn",i,temprature);
                       }
                     else      热电偶掉线
                        {
                           printf("热电偶掉线");
                        }
                }
              else        //max6675没有数据返回
              {
                   printf("max6675没有数据返回");
               }
              delay_1S(1);//两次转换之间间隔1s
          }
      }

已退回10积分

更多回帖

发帖
×
20
完善资料,
赚取积分