打印

香主,关注一下SPI DMA方式的问题

[复制链接]
4086|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
51FLY|  楼主 | 2008-7-15 16:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
香主你好:

我做SPI DMA接收的试验,使用ST的例程。操作没有问题。

可是不能实现循环接收,例程是发送一次,而后查询标志,就结束了。

如何实现不断查询标志的接收啊,也就是接收循环起来!!!万分感谢。

int main(void)
{
#ifdef DEBUG
  debug();
#endif

  /* System clocks configuration ---------------------------------------------*/
  RCC_Configuration();

  /* NVIC configuration ------------------------------------------------------*/
  NVIC_Configuration();

  /* GPIO configuration ------------------------------------------------------*/
  GPIO_Configuration();

  /* DMA1 channel4 configuration ---------------------------------------------*/
  DMA_DeInit(DMA1_Channel4);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SPI2_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SPI2_Buffer_Rx;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  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_VeryHigh;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel4, &DMA_InitStructure);

  /* SPI1 configuration ------------------------------------------------------*/
  SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);

  /* SPI2 configuration ------------------------------------------------------*/
  SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Rx;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
  SPI_Init(SPI2, &SPI_InitStructure);

  /* Enable SPI1 NSS output for master mode */
  SPI_SSOutputCmd(SPI1, ENABLE);

  /* Enable SPI2 Rx request */
  SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);

  /* Enable SPI2 */
  SPI_Cmd(SPI2, ENABLE);
  /* Enable SPI1 */
  SPI_Cmd(SPI1, ENABLE);

  /* Enable DMA1 Channel4 */
  DMA_Cmd(DMA1_Channel4, ENABLE);

  /* Transfer procedure */
  while (TxIdx < BufferSize)
  {
    /* Wait for SPI1 Tx buffer empty */
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    /* Send SPI1 data */
    SPI_I2S_SendData(SPI1, SPI1_Buffer_Tx[TxIdx++]);
  }

  /* Wait for DMA1 channel4 transfer complete */
  while (!DMA_GetFlagStatus(DMA1_FLAG_TC4));

  /* Check the corectness of written data */
  TransferStatus = Buffercmp(SPI2_Buffer_Rx, SPI1_Buffer_Tx, BufferSize);
  /* TransferStatus = PASSED, if the transmitted and received data
     are equal */
  /* TransferStatus = FAILED, if the transmitted and received data
     are different */

  while (1)
  {}
}
沙发
51FLY|  楼主 | 2008-7-15 16:59 | 只看该作者

也就是把这部分做成循环

/* Wait for DMA1 channel4 transfer complete */
  while (!DMA_GetFlagStatus(DMA1_FLAG_TC4));

  /* Check the corectness of written data */
  TransferStatus = Buffercmp(SPI2_Buffer_Rx, SPI1_Buffer_Tx, BufferSize);
  /* TransferStatus = PASSED, if the transmitted and received data
     are equal */
  /* TransferStatus = FAILED, if the transmitted and received data
     are different */

使用特权

评论回复
板凳
51FLY|  楼主 | 2008-7-15 17:00 | 只看该作者

STM32还在摸索之中,可是任务不等人啊

使用特权

评论回复
地板
香水城| | 2008-7-15 17:16 | 只看该作者

当然是从新设置Buffer和DMA的各项参数

使用特权

评论回复
5
51FLY|  楼主 | 2008-7-15 19:39 | 只看该作者

能否具体点啊。。大侠

while(1)
{
 while (!DMA_GetFlagStatus(DMA1_FLAG_TC4));
...
...
..
...
...




}

使用特权

评论回复
6
51FLY|  楼主 | 2008-7-15 19:59 | 只看该作者

等候中

步骤是这样:初始化SPI2->初始化DMA5->启动DMA5->判断DMA5_FLAG_TC5看是否传输完成。再次启动DMA5.......

问题是这样的:第一次DMA传输没有问题。但之后的DMA传输没有进行。我修改成每次DMA传输前都要初始化一遍DMA寄存器就可以了。

请问:是否可以不用每次都初始化DMA呢?是否只要设置DMA的某个寄存器就可以进行下一次的DMA传输?

使用特权

评论回复
7
香水城| | 2008-7-16 10:25 | 只看该作者

你至少应该重新设置地址寄存器和数据长度寄存器

它们在DMA操作时是会变的。

使用特权

评论回复
8
51FLY|  楼主 | 2008-7-17 16:12 | 只看该作者

现在的问题是有时收到的数据全为0,只有复位才能正常!!

使用特权

评论回复
9
香水城| | 2008-7-17 21:59 | 只看该作者

6楼的重新初始化是对的

如果你会直接对寄存器操作,则可以按照我在7楼说的办法:重新设置地址寄存器和数据长度寄存器。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

56

帖子

1

粉丝