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

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-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-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);
    }

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位数的高低字节次序有没有反了?
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版