你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
木小犀 提问时间:2017-1-13 16:24 /
本帖最后由 木小犀 于 2017-1-13 17:27 编辑
  1. <div class="blockcode"><blockquote>#include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"

  4. #define SPI1_CS_Pin GPIO_PIN_4

  5. void Delay(__IO uint32_t nCount);

  6. void Delay(__IO uint32_t nCount)
  7. {
  8. while(nCount--){}
  9. }

  10. int main(void)
  11. {
  12.     uint16_t GetData=0;
  13.     uint16_t Temperature = 0;
  14.     uint16_t T = 0;



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


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

  19.     __HAL_RCC_SPI1_CLK_ENABLE();        //开启SP1时钟
  20.     __HAL_RCC_USART1_CLK_ENABLE();
  21.     __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟

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

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

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

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


  50.     while(1)
  51.     {
  52.         SPI1_L;        //开启片选
  53.         HAL_SPI_Receive(&hspi1, (uint8_t *)&GetData, 1, 1000);
  54.         Temperature = (GetData>>3)&0x0fff;
  55.         SPI1_H;        
  56.         HAL_Delay(1000);

  57.         T = Temperature*1024/4095;
  58.         printf ("Temperature:%d\n",T);
  59.     }
  60. }
复制代码

显示结果
有人能帮忙看看代码有什么问题吗?有一个问题请教:SPI配置支持16Bit数据,
但是HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)却是8Bit数据,应该怎么处理?

收藏 3 评论18 发布时间:2017-1-13 16:24

举报

18个回答
无薪税绵 回答时间: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就可以了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

木小犀 回答时间:2017-2-9 21:37:07
无薪税绵 发表于 2017-1-21 08:23
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t T ...
  1. HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
  2. {
  3.   __IO uint16_t tmpreg;
  4.   uint32_t tmp = 0;

  5.   if(hspi->State == HAL_SPI_STATE_READY)
  6.   {
  7.     if((pData == NULL ) || (Size == 0))
  8.     {
  9.       return  HAL_ERROR;
  10.     }

  11.     /* Process Locked */
  12.     __HAL_LOCK(hspi);

  13.     /* Configure communication */
  14.     hspi->State       = HAL_SPI_STATE_BUSY_RX;
  15.     hspi->ErrorCode   = HAL_SPI_ERROR_NONE;

  16.     hspi->pRxBuffPtr  = pData;
  17.     hspi->RxXferSize  = Size;
  18.     hspi->RxXferCount = Size;

  19.     /*Init field not used in handle to zero */
  20.     hspi->RxISR = 0;
  21.     hspi->TxISR = 0;
  22.     hspi->TxXferSize   = 0;
  23.     hspi->TxXferCount  = 0;

  24.     /* Configure communication direction : 1Line */
  25.     if(hspi->Init.Direction == SPI_DIRECTION_1LINE)
  26.     {
  27.       SPI_1LINE_RX(hspi);
  28.     }

  29.     /* Reset CRC Calculation */
  30.     if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
  31.     {
  32.       SPI_RESET_CRC(hspi);
  33.     }
  34.    
  35.     if((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES))
  36.     {
  37.       /* Process Unlocked */
  38.       __HAL_UNLOCK(hspi);

  39.       /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
  40.       return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout);
  41.     }

  42.     /* Check if the SPI is already enabled */
  43.     if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
  44.     {
  45.       /* Enable SPI peripheral */
  46.       __HAL_SPI_ENABLE(hspi);
  47.     }

  48.     /* Receive data in 8 Bit mode */
  49.     if(hspi->Init.DataSize == SPI_DATASIZE_8BIT)
  50.     {
  51.       while(hspi->RxXferCount > 1)
  52.       {
  53.         /* Wait until RXNE flag is set */
  54.         if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
  55.         {
  56.           return HAL_TIMEOUT;
  57.         }

  58.         (*hspi->pRxBuffPtr++) = hspi->Instance->DR;
  59.         hspi->RxXferCount--;
  60.       }
  61.       /* Enable CRC Transmission */
  62.       if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
  63.       {
  64.         hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
  65.       }
  66.     }
  67.     /* Receive data in 16 Bit mode */
  68.     else
  69.     {
  70.       while(hspi->RxXferCount > 1)
  71.       {
  72.         /* Wait until RXNE flag is set to read data */
  73.         if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
  74.         {
  75.           return HAL_TIMEOUT;
  76.         }

  77.         *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
  78.         hspi->pRxBuffPtr+=2;
  79.         hspi->RxXferCount--;
  80.       }
  81.       /* Enable CRC Transmission */
  82.       if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
  83.       {
  84.         hspi->Instance->CR1 |= SPI_CR1_CRCNEXT;
  85.       }
  86.     }

  87.     /* Wait until RXNE flag is set */
  88.     if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
  89.     {
  90.       return HAL_TIMEOUT;
  91.     }

  92.     /* Receive last data in 8 Bit mode */
  93.     if(hspi->Init.DataSize == SPI_DATASIZE_8BIT)
  94.     {
  95.       (*hspi->pRxBuffPtr++) = hspi->Instance->DR;
  96.     }
  97.     /* [color=Red]Receive last data in 16 Bit mode [/color]*/
  98.     else
  99.     {
  100.       *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR;
  101.       hspi->pRxBuffPtr+=2;
  102.     }
  103.     hspi->RxXferCount--;

  104.     /* Wait until RXNE flag is set: CRC Received */
  105.     if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
  106.     {
  107.       if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
  108.       {
  109.         hspi->ErrorCode |= HAL_SPI_ERROR_CRC;
  110.         return HAL_TIMEOUT;
  111.       }

  112.       /* Read CRC to Flush RXNE flag */
  113.       tmpreg = hspi->Instance->DR;
  114.       UNUSED(tmpreg);
  115.     }
  116.    
  117.     if((hspi->Init.Mode == SPI_MODE_MASTER)&&((hspi->Init.Direction == SPI_DIRECTION_1LINE)||(hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))
  118.     {
  119.       /* Disable SPI peripheral */
  120.       __HAL_SPI_DISABLE(hspi);
  121.     }

  122.     hspi->State = HAL_SPI_STATE_READY;

  123.     tmp = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR);
  124.     /* Check if CRC error occurred */
  125.     if((hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) && (tmp != RESET))
  126.     {  
  127.       hspi->ErrorCode |= HAL_SPI_ERROR_CRC;

  128.       /* Reset CRC Calculation */
  129.       SPI_RESET_CRC(hspi);

  130.       /* Process Unlocked */
  131.       __HAL_UNLOCK(hspi);

  132.       return HAL_ERROR;
  133.     }

  134.     /* Process Unlocked */
  135.     __HAL_UNLOCK(hspi);

  136.     return HAL_OK;
  137.   }
  138.   else
  139.   {
  140.     return HAL_BUSY;
  141.   }
  142. }
复制代码

其中有针对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[3] = {0};
while(1)
    {
        SPI1_L;        //开启片选
        HAL_SPI_Receive(&hspi1, temp_buf, 2, 1000);
        SPI1_H;
                Ret_MAX6675 = temp_buf[0]<<8 | temp_buf[1];
        T = (Ret_MAX6675>>3)&0x0fff;        
        HAL_Delay(1000);
               
        T = T*1024/4095;
        printf ("Temperature:%d\n",T);
    }

木小犀 回答时间:2017-1-13 16:33:03
木小犀 回答时间:2017-1-13 16:35:38
弄了好久了,头都大了。

max6675时序图

max6675时序图
jackten 回答时间:2017-1-14 09:13:15
应该还有另外一条语句是传输16bit的

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

小小超 回答时间: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位数的高低字节次序有没有反了?
wenyangzeng 回答时间:2017-1-21 09:50:55
本帖最后由 wenyangzeng 于 2017-1-21 09:53 编辑

本贴可以供你作参考:
https://www.stmcu.org.cn/module/forum/thread-566825-1-1.html
发送方式:
SPI_SendData8(SPI1,data);

接收你可以类推。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

Paderboy 回答时间:2017-1-21 10:50:13
签到
中山无雪 回答时间:2017-1-21 10:58:07
zoomdy 发表于 2017-1-21 09:39
16位数的高低字节次序有没有反了?

确实应该注意一下顺序问题

当前显示的数据只有8bit,还缺一半呢,因此显示的结果肯定不正确

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

zbber 回答时间:2017-1-21 14:27:53
学习学习,谢谢楼主,支持分享
cldym 回答时间:2017-1-21 15:18:14
学习学习
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版