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

SPI读取数据是MOSI怎么一直保持0xFF输出?

[复制链接]
灰泥鳅 提问时间:2019-11-19 00:34 /
最近在做SD卡的程序,使用模拟SPI可以正常读写,但是改成硬件SPI后发现SD卡反馈的数据不对。
通过时序对比发现,异常的SD卡读取时序读取前的Dummy信号将MOSI输出为上一次发送的数据了,
比如上一次发送的数据是0x87,那么当进行SPI读取时,它会将MOSI设置为0x87,后面的读取才是
0xFF,这样就导致了连续发送了两次0x87,使得通信异常。

请问有没有办法让SPI读取时保持MOSI为0xFF?

正常的SD卡读取时序:
1-正常的SD卡读取时序.png

异常的SD卡读取时序:
1-异常的SD卡读取时序.png

端口初始化代码:
  1. static void MX_GPIO_Init(void)
  2. {

  3.   GPIO_InitTypeDef GPIO_InitStruct;

  4.   /* GPIO Ports Clock Enable */
  5.   __HAL_RCC_GPIOF_CLK_ENABLE();
  6.   __HAL_RCC_GPIOA_CLK_ENABLE();
  7.   __HAL_RCC_GPIOE_CLK_ENABLE();
  8.   __HAL_RCC_GPIOD_CLK_ENABLE();
  9.   __HAL_RCC_GPIOG_CLK_ENABLE();

  10.   /*Configure GPIO pin Output Level */
  11.   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

  12.   /*Configure GPIO pin Output Level */
  13.   HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, GPIO_PIN_RESET);

  14.   /*Configure GPIO pin : PA4 */
  15.   GPIO_InitStruct.Pin = GPIO_PIN_4;
  16.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  17.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  18.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  19.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  20.        
  21.         GPIO_InitStruct.Pin = GPIO_PIN_6;
  22.   GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT;
  23.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  24.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  25.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  26.        
  27.         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);        //端口不写1会导致一直读入的都是低电平

  28.         __HAL_RCC_GPIOC_CLK_ENABLE();
  29.         GPIO_InitStruct.Pin = GPIO_PIN_3;
  30.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  31.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  32.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  33.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  34.        
  35.   /*Configure GPIO pin : PG9 */
  36.   GPIO_InitStruct.Pin = GPIO_PIN_9;
  37.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  38.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  39.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  40.   HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  41.   /*Configure GPIO pins : PG12 PG13 PG14 PG15 */
  42.   GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  43.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  44.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  45.   HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  46. }
复制代码

SPI初始化代码:
  1. /* SPI1 init function */
  2. static void MX_SPI1_Init(void)
  3. {

  4.   /* SPI1 parameter configuration*/
  5.   hspi1.Instance = SPI1;
  6.   hspi1.Init.Mode = SPI_MODE_MASTER;
  7.   hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  8.   hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  9.   hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;//SPI_POLARITY_HIGH;
  10.   hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;//SPI_PHASE_2EDGE;
  11.   hspi1.Init.NSS = SPI_NSS_SOFT;
  12.   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
  13.   hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  14.   hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  15.   hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  16.   hspi1.Init.CRCPolynomial = 10;
  17.   if (HAL_SPI_Init(&hspi1) != HAL_OK)
  18.   {
  19.     _Error_Handler(__FILE__, __LINE__);
  20.   }

  21. }
复制代码

SPI发送代码:
  1.         HAL_SPI_Transmit(&hspi1, &d, 1, 1000);
复制代码

SPI接收代码:
  1.         HAL_SPI_Receive(&hspi1, &r, 1, 1000);
复制代码



收藏 评论5 发布时间:2019-11-19 00:34

举报

5个回答
七哥 回答时间:2019-11-19 09:52:48
用发送函数读数据,读时肯定会发,发时可以不读(对读取内容不理会)。

评分

参与人数 2ST金币 +2 蝴蝶豆 +2 收起 理由
STMCU + 2
grayloach + 2 很给力!

查看全部评分

李康1202 回答时间:2019-11-19 08:51:01
改一下时钟极性和时钟相位试一试
灰泥鳅 回答时间:2019-11-22 00:07:06
likang1202 发表于 2019-11-19 08:51
改一下时钟极性和时钟相位试一试

还是一样的,输出转输入后的第一次读数还是会把上一次的数据传输到MOSI端口。
灰泥鳅 回答时间:2019-11-22 00:07:59
toofree 发表于 2019-11-19 09:52
用发送函数读数据,读时肯定会发,发时可以不读(对读取内容不理会)。

硬件SPI也可以这么操作?但是貌似STM32的硬件SPI的读写共用了一个DR寄存器,不知道怎么操作了。
灰泥鳅 回答时间:2019-11-23 23:38:29
toofree 发表于 2019-11-19 09:52
用发送函数读数据,读时肯定会发,发时可以不读(对读取内容不理会)。

已解决,谢谢!

所属标签

相似问题

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