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

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

[复制链接]
木小犀 提问时间:2017-1-13 16:24 /
阅读主题, 点击返回1楼
收藏 3 评论18 发布时间:2017-1-13 16:24
18个回答
peter001 回答时间:2017-1-21 22:27:04
学习学习
木小犀 回答时间: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-2-28 14:33:36
无薪税绵 发表于 2017-1-21 08:23
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t T ...

已经改好了,现在有一个问题,就是数据偶尔会出现问题,温度是实际的2倍,是不是最高位丢失,后面数据都向前进了一位,还有为什么是偶尔出错,大部分的结果都是正确的。
1111.png
wbaojang 回答时间:2020-4-4 09:30:26
12
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版