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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版