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

使用 HAL 库,spi 读写函数,?

[复制链接]
hpdell 提问时间:2016-11-19 22:24 /
悬赏2ST金币已解决
使用 HAL 库,spi 读写函数,?

具体如下:

方法 1:
_SPI_FLASH_TATUS_T SPI_FlashReadBuffer(uint8_t * _pBuf, uint32_t _uiReadAddr, uint32_t _uiSize)
{       
        SPI_FLASH_CS_L;       

  // 芯片 W25Q256, 512 是 32bit地址
  if(g_tFlash.ChipID >= JEDEC_W25Q256FVSG_ID)                //如果是W25Q256的话地址为4字节的,要发送最高8位
  {
    uint8_t TxAddr[5] ;

    TxAddr[0] = W25Q_ReadData;
    TxAddr[1] = (uint8_t)((_uiReadAddr)>>24);
    TxAddr[2] = (uint8_t)((_uiReadAddr)>>16);
    TxAddr[3] = (uint8_t)((_uiReadAddr)>>8);
    TxAddr[4] = (uint8_t)((_uiReadAddr)>>0);

    HAL_SPI_Transmit(&hspi2, &TxAddr[0], 5, 0x1fff);
  }

  else
  {
    uint8_t TxAddr[5] ;

    TxAddr[0] = W25Q_ReadData;
    TxAddr[1] = (uint8_t)((_uiReadAddr)>>16);
    TxAddr[2] = (uint8_t)((_uiReadAddr)>>8);
    TxAddr[3] = (uint8_t)((_uiReadAddr)>>0);

    HAL_SPI_Transmit(&hspi2, &TxAddr[0], 4, 0x1fff);  
  }

  HAL_SPI_Receive( &hspi2, _pBuf, _uiSize, 0x3fffff);    // 采用此方法接收数据速度至少快4倍或以上


SPI_FLASH_CS_H;

  return SPI_FLASH_OK;
}




方法2:

static uint8_t SPI_ReadWriteByte(uint8_t TxData)
{
    uint8_t Rxdata;
    HAL_SPI_TransmitReceive(&hspi2, &TxData, &Rxdata, 1, 1000);      
        return Rxdata;                              //返回收到的数据               
}




_SPI_FLASH_TATUS_T SPI_FlashReadBuffer(uint8_t * _pBuf, uint32_t _uiReadAddr, uint32_t _uiSize)
{       

        SPI_FLASH_CS_L;       

  SPI_ReadWriteByte(W25Q_ReadData);

  // 芯片 W25Q256, 512 是 32bit地址
  if(g_tFlash.ChipID >= JEDEC_W25Q256FVSG_ID)                //如果是W25Q256的话地址为4字节的,要发送最高8位
  {
    SPI_ReadWriteByte((uint8_t)((_uiReadAddr)>>24));
  }

  SPI_ReadWriteByte((uint8_t)((_uiReadAddr)>>16));    // 发送 24 bit 地址
  SPI_ReadWriteByte((uint8_t)((_uiReadAddr)>>8));
  SPI_ReadWriteByte((uint8_t)((_uiReadAddr)>>0));

  while (_uiSize--)
  {
    *_pBuf++ = SPI_ReadWriteByte(0XFF);    // 读一个字节并存储到pBuf,读完后指针自加1
  }
        SPI_FLASH_CS_H;

  return SPI_FLASH_OK;
}



上述两种方法,方法一,程序有时不稳定,

                         方法二,每次都可以,但是速度较慢,

请教下,这是何故啊 ??











最佳答案

查看完整内容

第一种: 2个字节以上的数据按16位方式发送中间不停连续发,从设备只接收8位中间要停下导致处理不过来16位数据速度过快, 第二种:是8位方式发送,这个速度不是很快8个位之间有停,所以从设备能处理的过来.所以稳定
收藏 1 评论2 发布时间:2016-11-19 22:24

举报

2个回答
mark0668 回答时间:2016-11-19 22:24:14
本帖最后由 mark0668 于 2016-11-19 22:49 编辑

第一种: 2个字节以上的数据按16位方式发送中间不停连续发,从设备只接收8位中间要停下导致处理不过来16位数据速度过快,

第二种:是8位方式发送,这个速度不是很快8个位之间有停,所以从设备能处理的过来.所以稳定

评分

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

查看全部评分

hpdell 回答时间:2016-11-20 11:32:58
mark0668 发表于 2016-11-19 22:48
第一种: 2个字节以上的数据按16位方式发送中间不停连续发,从设备只接收8位中间要停下导致处理不过来16位数 ...

原来是这样啊,多些多些了啊

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版