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

SPI全双工模式 实际测试有数据但是采集不到

[复制链接]
木子-387117 提问时间:2017-2-21 10:52 /
阅读主题, 点击返回1楼
收藏 1 评论33 发布时间:2017-2-21 10:52
33个回答
囧囧 回答时间:2017-2-21 16:24:53
贴上代码来看看
木子-387117 回答时间:2017-2-21 16:46:36
本帖最后由 木子-387117 于 2017-2-21 16:47 编辑
两种方式调用HAL库函数  单独测试过
uint8_t liming=0x06;地址
uint8_t liming2=0x00;
uint8_t lmGET_data;  返回数据存放
        while(1){
               
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 ,GPIO_PIN_RESET );
          HAL_SPI_Transmit(&hspi1,&liming2,sizeof(liming2),1000);        
          HAL_SPI_Receive(&hspi1,&lmGET_data,sizeof(lmGET_data),1000);
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 ,GPIO_PIN_SET );
               
if(lmGET_data==0x6c)
printf("\r\n LoRaOn \r\n");        

   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 ,GPIO_PIN_RESET );
       HAL_SPI_Transmit(&hspi1,&liming,sizeof(liming),1000);
       HAL_SPI_TransmitReceive(&hspi1, &liming2, &lmGET_data, 1, 1000);
   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 ,GPIO_PIN_SET );
if(lmGET_data==0x6c)
printf("\r\n LoRaOn \r\n");        
}
囧囧 回答时间:2017-2-21 16:55:19
或许你的初始化配置有问题,贴出你的spi配置图or代码

评分

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

查看全部评分

木子-387117 回答时间:2017-2-21 16:59:44
本帖最后由 木子-387117 于 2017-2-21 17:03 编辑
xuezhimeng2010 发表于 2017-2-21 16:55
或许你的初始化配置有问题,贴出你的spi配置图or代码
9楼有spi协议  (今天传图太多 不让传了~~只能劳驾往上翻一翻了)
/* SPI1 init function */
void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;//ËÙ¶È×îÂýÊÔÊÔ¿´
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

}
囧囧 回答时间:2017-2-21 17:03:26
你这个初始化代码调用了么?看下spi1的寄存器
木子-387117 回答时间:2017-2-21 17:05:49
xuezhimeng2010 发表于 2017-2-21 17:03
你这个初始化代码调用了么?看下spi1的寄存器

调用啦  MOSI输出数据MISO都有对应的返回数据 而且示波器自己读是正确的
囧囧 回答时间:2017-2-21 17:15:19
木子-387117 发表于 2017-2-21 17:05
调用啦  MOSI输出数据MISO都有对应的返回数据 而且示波器自己读是正确的

那看下输入引脚上的配置,一步步看寄存器吧
木子-387117 回答时间:2017-2-21 17:16:21
xuezhimeng2010 发表于 2017-2-21 17:03
你这个初始化代码调用了么?看下spi1的寄存器

全速跑起来  keil5里面的工具看寄存器 COPL CPHA 都是0  因为我循环发送接收数据所以BSY TXE时而0时而1 但是RXNE时而0时而1的频率很慢  按理说应该有TXE变化速度一半啊
木子-387117 回答时间:2017-2-21 17:19:24
xuezhimeng2010 发表于 2017-2-21 17:15
那看下输入引脚上的配置,一步步看寄存器吧

我觉得问题在于我用示波器检测到MISO返回数据了 而且是正确数据  但是receive函数读不到
木子-387117 回答时间:2017-2-21 21:38:17
watershade 发表于 2017-2-21 20:56
是这样的。我看你的SPI两个字节是连续发送。你是用这两个命令之后来实现可以从波形上明显看出中间有一段停 ...

首先谢过水影先森的解答~~
1.确实我访问的器件需要MOSI先给八位地址再给八位数据,然后MISO返回寄存器数据,
2.HAL_SPI_TransmitReceive我想到了直接发送两个字节了 把地址和数据一起发出去,但是接收的还是全0
     奇怪的是我用示波器测出来是有数据的 而且是正确的  真是诡异
3.CPAL和CPOL设置都为0 检查过了
4.liming2就是简单的 uchar类型  
木子-387117 回答时间:2017-2-22 14:32:43
刷新一下
zbber 回答时间:2017-2-22 15:27:28
什么叫实际测试有数据但是采集不到?
木子-387117 回答时间:2017-2-22 15:57:55
zbber 发表于 2017-2-22 15:27
什么叫实际测试有数据但是采集不到?

就是示波器我自己测数据 用示波器观察  MISO有返回数据~~~但是receive函数接收存起来一直都是0
木子-387117 回答时间:2017-2-22 17:23:03
void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(spiHandle->Instance==SPI1)
  {
  /* USER CODE BEGIN SPI1_MspInit 0 */

  /* USER CODE END SPI1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_SPI1_CLK_ENABLE();
  
    /**SPI1 GPIO Configuration   
    PA4     ------> SPI1_NSS
    PA5     ------> SPI1_SCK
    PA6     ------> SPI1_MISO
    PA7     ------> SPI1_MOSI
    */
    GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
    GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
               
                GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT ;
                GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
                HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  /* USER CODE BEGIN SPI1_MspInit 1 */

  /* USER CODE END SPI1_MspInit 1 */
  }
}
watershade 回答时间:2017-2-22 21:31:55
木子-387117 发表于 2017-2-21 21:38
首先谢过水影先森的解答~~
1.确实我访问的器件需要MOSI先给八位地址再给八位数据,然后MISO返回寄存器数 ...

那你试着用中断的方式再读一下。要不就是你MISO管脚的配置有问题。你用官方的例程编译一下试试

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版