最近在项目中用到了热电偶测量温度,选用了处理芯片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
}
}