6669|5

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

SPI2发送使用DMA操作的数据不对 [复制链接]

我使用SPI2操作M25P64,在写M25P64的时候,如果使用软件发送,读回来的数据是正确的,但是如果使用DMA发送数据即不正确。读回来的数据是0xff.下面是写M25P64的代码,帮忙看看是什么问题?是不是发送用DMA时没有对时钟进行控制,造成对SPI2写溢出?
static void DMA_TxConfiguration(const INT8U *BufferSRC, INT32U BufferSize)
{
    DMA_InitTypeDef DMA_InitStructure;

    DMA_ClearFlag(DMA1_FLAG_TC5 | DMA1_FLAG_TE5 | DMA1_FLAG_HT5 | DMA1_FLAG_GL5);

    /* DMA1 Channel5 disable */
    DMA_Cmd(DMA1_Channel5, DISABLE);

    /* DMA1 Channel5 Config */
    DMA_InitStructure.DMA_PeripheralBaseAddr = (INT32U)SPI2_DR_Address;
    DMA_InitStructure.DMA_MemoryBaseAddr = (INT32U)BufferSRC;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
    DMA_InitStructure.DMA_BufferSize = BufferSize;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel5, &DMA_InitStructure);

    /* Enable SPI2 DMA Tx request */
    SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
    /* DMA1 Channel3 enable */
    DMA_Cmd(DMA1_Channel5, ENABLE);
    while(!DMA_GetFlagStatus(DMA1_FLAG_TC5));
}
static void SPI_FLASH_PageWrite(const INT8U* pBuffer,INT32U WriteAddr,INT16U NumByteToWrite)
{
    if(0 == NumByteToWrite)
        return;
    /* Enable the write access to the FLASH */
    SPI_FLASH_WriteEnable();
  
    /* Select the FLASH: Chip Select low */
    SPI_FLASH_CS_LOW();
    /* Send "Write to Memory " instruction */
    SPI_FLASH_SendByte(WRITE);
    /* Send WriteAddr high nibble address byte to write to */
    SPI_FLASH_SendByte((WriteAddr & 0xFF0000) >> 16);
    /* Send WriteAddr medium nibble address byte to write to */
    SPI_FLASH_SendByte((WriteAddr & 0xFF00) >> 8);  
    /* Send WriteAddr low nibble address byte to write to */
    SPI_FLASH_SendByte(WriteAddr & 0xFF);
#if 1  
    /* while there is data to be written on the FLASH */
    while(NumByteToWrite--) 
    {
        /* Send the current byte */
        SPI_FLASH_SendByte(*pBuffer);
        /* Point on the next byte to be written */
        pBuffer++; 
    }
    /* Deselect the FLASH: Chip Select high */
    SPI_FLASH_CS_HIGH();
    /* Wait the end of Flash writing */
    SPI_FLASH_WaitForWriteEnd();
#else
    DMA_TxConfiguration(pBuffer,NumByteToWrite);
    SPI_FLASH_CS_HIGH();
    SPI_FLASH_WaitForWriteEnd();
#endif  
}
此帖出自stm32/stm8论坛

最新回复

                                 请问如何检查设备的时序?基础问题我还不是很懂 这个问题需要从你使用的外部设备的数据手册中找答案,一般的数据手册中都会有时序的说明。  详情 回复 发表于 2009-9-9 23:46
点赞 关注
 

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

用示波器看看

                                 再尝试把SPI速度降低点看看。
此帖出自stm32/stm8论坛
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

用示波器看到的结果

设置SPI的时钟为4.5MHz
使用软件发送时:发送1byte到下1byte的时间是4.56us,每bit的时间是220ns
使用DMA发送时:发送1byte到下1byte的时间是3.32us,每bit的时间是220ns
这些可以得出什么结论吗?
此帖出自stm32/stm8论坛
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 

1)你可能要检查一下你的设备的时序,2)检查SPI传输结束标

从你给出的数据看,软件发送与DMA发送相比,每bit的时间是一样的,但每byte的时间不一样,这需要检查的设备时序。


还有一个问题,DMA结束时,SPI的传输还没有结束,你需要在DMA结束后通过检查SPI_SR的BSY标志,决定SPI的传输结束。估计这可能是你的问题。
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 请问如何检查设备的时序?基础问题我还不是很懂
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
请问如何检查设备的时序?基础问题我还不是很懂
这个问题需要从你使用的外部设备的数据手册中找答案,一般的数据手册中都会有时序的说明。
此帖出自stm32/stm8论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表