野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11365|回复: 5

SPI 通信为什么这么写就错了,求解答

[复制链接]
发表于 2016-3-22 09:35:13 | 显示全部楼层 |阅读模式
这是野火教程SPI_FLASH 中读写一个字节的原程序
u8 SPI_FLASH_SendByte(u8 byte)
{
  /* Loop while DR register in not emplty */
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

  /* Send byte through the SPI1 peripheral */
  SPI_I2S_SendData(SPI1, byte);

  /* Wait to receive a byte */
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

  /* Return the byte read from the SPI bus */
  return SPI_I2S_ReceiveData(SPI1);
}
我的想法:然后Flash就忽略DIO线,通过DO线把ID输送给主机;既然忽略,那我干嘛还要发送一个Dummy字节数据干嘛,主机能直接受数据吗?
将发送和接受分开写。
void SPI_FLASH_SendByte( u8 byte)
{
        /*Loop while DR Register in not empty----when DR_Send buffer is empty,data will be sended*/
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)== RESET);
        /*Send data through the peripher*/
        SPI_I2S_SendData(SPI1,byte);
       
}
/**
  * @brief Receive byte from the FLASH .
  * @param  None
  * @retval None
  */
u8 SPI_FLASH_ReceiveByte(void)
{
        /*Loop while DR Register in  empty ------when DR_Receive buffer is not empty,data will be receive*/
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)== RESET);
        /*Return the byte read from SPI bus*/
        return SPI_I2S_ReceiveData(SPI1);
}
那木其他程序作出相应的修改;
例如读取W25X16 DeviceID的程序为:
/**
  * @brief  Read the W25Q16 DeviceID .
  * @param  None
  * @retval None
  */
u32 SPI_FLASH_ReadDeviceID(void)
{
        u32 Temp = 0;
        /*Select the Flash: chip select low*/
        SPI_FLASH_CS_LOW();
        /*Send the ReadDeviceID instruction */
        SPI_FLASH_SendByte(W25X_DeviceID);
        SPI_FLASH_SendByte(Dummy);
        SPI_FLASH_SendByte(Dummy);
        SPI_FLASH_SendByte(Dummy);
       
        Temp = SPI_FLASH_ReceiveByte();
        /*Deselsect the FLASH: chip select high*/
        SPI_FLASH_CS_HIGH();
       
        return Temp;
}
但是我自己仿写修改的程序无法读取和接受FLASH的数据。这是为什么?
我软仿结果发现....还像主机一直循环在等待从FLASH接受数据.....
求各位大神告知真相???分析一下


然后Flash就忽略DIO线,通过DO线把ID输送给主机;既然忽略,那我干嘛还要发送一个Dummy字节数据干嘛,主机 ...

然后Flash就忽略DIO线,通过DO线把ID输送给主机;既然忽略,那我干嘛还要发送一个Dummy字节数据干嘛,主机 ...

我失败的实验现象如下:

我失败的实验现象如下:
回复

使用道具 举报

 楼主| 发表于 2016-3-22 09:38:30 | 显示全部楼层
难道DIO线上一直有信号,从机才能把数据通过DO线发给主机,主机接受????@fire@flyleaf
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-22 09:39:01 | 显示全部楼层
@flyleaf 求看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-22 09:40:03 | 显示全部楼层
@fire 这是一个关于野火原程序的一个疑问(关于SPI_FLASH的问题)
回复 支持 反对

使用道具 举报

发表于 2016-3-22 14:03:44 | 显示全部楼层
flash在发送dummybye的时候同时返回数据,你没有接收这部分数据就没了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-24 14:59:04 | 显示全部楼层
flyleaf 发表于 2016-3-22 14:03
flash在发送dummybye的时候同时返回数据,你没有接收这部分数据就没了

由图可以得知,主机在DIO发送三个dummy,然后从机在DO线上返回Device ID ,我的程序中是发送了3个dummy字节后立即调用byteRecieve函数接受?难道单片机执行指令的速度还赶不上Flash的速度。。。。?
你的意思是说虽然忽略DIO线上的的信号,但是DIO的信号有无是DO返回数据的充分条件吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 13:33 , Processed in 0.038140 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表