木小犀 发表于 2017-1-13 16:24:57

STM32F4+MAX6675+K型热电偶测温度

本帖最后由 木小犀 于 2017-1-13 17:27 编辑

<div class="blockcode"><blockquote>#include "sys.h"
#include "delay.h"
#include "usart.h"

#define SPI1_CS_Pin GPIO_PIN_4

void Delay(__IO uint32_t nCount);

void Delay(__IO uint32_t nCount)
{
while(nCount--){}
}

int main(void)
{
    uint16_t GetData=0;
    uint16_t Temperature = 0;
    uint16_t T = 0;



    GPIO_InitTypeDef GPIO_A;      //定义一个GPIO_InitTypeDef的结构体GPIO_A
    SPI_HandleTypeDef hspi1;      //SPI句柄


    HAL_Init(); //初始化HAL库
    Stm32_Clock_Init(360,25,2,8); uart_init(115200); //初始化USART

    __HAL_RCC_SPI1_CLK_ENABLE();      //开启SP1时钟
    __HAL_RCC_USART1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟

    GPIO_A.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
    GPIO_A.Mode = GPIO_MODE_AF_PP;      //复用推挽输出
    GPIO_A.Pull=GPIO_PULLUP; //上拉
    GPIO_A.Speed = GPIO_SPEED_FAST; //2MHz
    GPIO_A.Alternate = GPIO_AF5_SPI1;
    HAL_GPIO_Init(GPIOA,&GPIO_A);      //上面为配置参数,此处启动初始化

    GPIO_A.Pin=SPI1_CS_Pin; //配置PA4(CS片选信号)
    GPIO_A.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
    GPIO_A.Speed = GPIO_SPEED_FAST; //2MHz
    HAL_GPIO_Init(GPIOA,&GPIO_A);      //上面为配置参数,此处启动初始化
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_SET);      // 先把片选拉高,真正用的时候再拉低

    hspi1.Instance = SPI1;
    hspi1.Init.Mode = SPI_MODE_MASTER;      //主模式
    hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;//SPI设置为单线接受
    hspi1.Init.DataSize = SPI_DATASIZE_16BIT;//SPI发送接收数据为16位帧格式
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;//同步时钟空闲状态为 di电平
    hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;      //同步时钟第一个跳变沿数据被采集      
    hspi1.Init.NSS = SPI_NSS_SOFT;      //NSS信号由软件控制
    hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; //波特率预分频值为256;
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;      //数据传输从MSB位开始
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE;      //关闭TI模式
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;      //关闭CRC
    hspi1.Init.CRCPolynomial = 7;      //CRC值计算的多项式
    HAL_SPI_Init(&hspi1);      //初始化
    __HAL_SPI_ENABLE(&hspi1);      //使能SPI1

    #define SPI1_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);//片选信号拉低为SPI_L
    #define SPI1_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);      //片选信号拉高为SPI_H
    SPI1_H;      //拉高片选,为后面开启片选做准备


    while(1)
    {
      SPI1_L;      //开启片选
      HAL_SPI_Receive(&hspi1, (uint8_t *)&GetData, 1, 1000);
      Temperature = (GetData>>3)&0x0fff;
      SPI1_H;      
      HAL_Delay(1000);

      T = Temperature*1024/4095;
      printf ("Temperature:%d\n",T);
    }
}

显示结果http://www.openedv.com/data/attachment/forum/201701/13/105943gr3ksgg2l8uruiiy.png
有人能帮忙看看代码有什么问题吗?有一个问题请教:SPI配置支持16Bit数据,
但是HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)却是8Bit数据,应该怎么处理?

无薪税绵 发表于 2017-1-21 08:23:23

HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

uint8_t *pData 这个是指针,可以传16bit的数据,只要Size =2就可以了。

木小犀 发表于 2017-1-13 16:33:03

http://www.embed-net.com/data/attachment/forum/201605/31/113756p00eax1lezj40yme.jpg

木小犀 发表于 2017-1-13 16:35:38

弄了好久了,头都大了。

jackten 发表于 2017-1-14 09:13:15

应该还有另外一条语句是传输16bit的

木小犀 发表于 2017-1-14 15:34:32

jackten 发表于 2017-1-14 09:13
应该还有另外一条语句是传输16bit的

This section contains the following APIs:
HAL_SPI_Transmit()
HAL_SPI_Receive()
HAL_SPI_TransmitReceive()
HAL_SPI_Transmit_IT()
HAL_SPI_Receive_IT()
HAL_SPI_TransmitReceive_IT()
HAL_SPI_Transmit_DMA()
HAL_SPI_Receive_DMA()
HAL_SPI_TransmitReceive_DMA()
HAL_SPI_DMAPause()
HAL_SPI_DMAResume()
HAL_SPI_DMAStop()
HAL_SPI_IRQHandler()
HAL_SPI_TxCpltCallback()
HAL_SPI_RxCpltCallback()
HAL_SPI_TxRxCpltCallback()
HAL_SPI_TxHalfCpltCallback()
HAL_SPI_RxHalfCpltCallback()
HAL_SPI_TxRxHalfCpltCallback()
HAL_SPI_ErrorCallback()里面涉及到的参数uint8_t * pData、uint8_t * pTxData、uint8_t * pRxData都是8bit的,
昨晚有一位大哥让我定义为数组,然后组合起来,但是还是有问题,
uint8_t temp_buf = {0};
while(1)
    {
      SPI1_L;      //开启片选
      HAL_SPI_Receive(&hspi1, temp_buf, 2, 1000);
      SPI1_H;
                Ret_MAX6675 = temp_buf<<8 | temp_buf;
      T = (Ret_MAX6675>>3)&0x0fff;      
      HAL_Delay(1000);
               
      T = T*1024/4095;
      printf ("Temperature:%d\n",T);
    }

ts2000 发表于 2017-1-21 08:17:16

是不是取样太快了,将所得的数据平均一下。

队长shiwo 发表于 2017-1-21 08:47:29

学习学习

any012 发表于 2017-1-21 09:23:56

无薪税绵 发表于 2017-1-21 08:23
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t T ...

赞成这个答案。

zoomdy 发表于 2017-1-21 09:39:03

16位数的高低字节次序有没有反了?
页: [1] 2
查看完整版本: STM32F4+MAX6675+K型热电偶测温度