戎传林
戎传林
This guy hasn't written anything yet

注册于 2 years ago

回答
0
文章
0
关注者
0

B76A9058-FC7F-4bf6-9279-B501093F60B8.png普通中断模式下,也是很OK的,但是就是DMA模式下,接收数据全是0。

    本帖最后由 戎传林 于 2019-8-16 19:11 编辑


有没有大佬搞过这个DMA模式的呀,为什么就是读不到呢?:(


使用逻辑分析仪抓的结果如下:发现在总线上数据是对的。但是DMA没有接收到,会不会是HAL库的BUG啊

A195A734-C563-4325-A677-EBDBEFB2354A.png

    本帖最后由 戎传林 于 2019-8-16 11:30 编辑


最终问题找到了,在SPI设备挂载到SPI 总线后,要先初始化一次,占用BUS总线,再去调用SFUD的库函数读写norfalsh。最后的结果是可以的。
但是目前还有一个问题,非中断模式的SPI 读写norflash是可以的了。但是为什么我配置成DMA之后就不行了。DMA发送中断,接收中断,SPI的中断都可以进。最终SPI的发送完成和接收完成中断也都进了。但是为什读ID的时候,读取的数据全是0呢?

CrisJay 发表于 2019-7-18 18:12
在RTT_IOT对应的正点原子的开发板上,其LCD接的是SPI3口。使用RTT官方的 “stm32l475-atk-pandora” bsp配 ...


这个问题你解决了吗,朋友

第一次读ID不对原因找到了,第一次spi 没有配置,总线Owner不匹配,第二次初始化的时候,spi配置之后,就可以读到ID。但是ID读多次,发现值不一样

    本帖最后由 戎传林 于 2019-8-15 13:33 编辑


为什么读出来都是这个东西啊
13895595-97F5-44ef-9EDB-45C2272C4946.png

调用SFUD函数,进行读写,结果也显示不正确
F973B925-3380-43f8-B938-40A16D025BC0.png

[img]C:\Users\Administrator\Desktop\89037A4C-D057-4de5-AF67-E306B8D94317.png[/img]
SPI芯片新加表如图
89037A4C-D057-4de5-AF67-E306B8D94317.png

这个芯片在SFUD表里面不支持,因此再表里面新加了这个芯片的相关信息:
{"MX25R6435F", SFUD_MF_ID_MICRONIX, 0x28, 0x17, 8L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}。

SPI总线和SPI设备片选CS信号也是对的。但是为什么调用SFUD驱动库里的函数时,ID却有时候可以读出,有时候又无法读出?同时也提示此芯片不支持SFUD,但芯片手册里面有描述,是支持的

Ernest 发表于 2019-8-13 12:54
没有什么特殊要求,欢迎参考 f429的驱动


DMA配置和您工程内的配置比较了,应该没有问题,但是发现DMA启动之后,SAI会报一个过载的错误,DMA报了一个传输失败错误。这个类型的错误,是否有可能是AD采集频率太高,数据在SAI FIFO内来不及取出呢?

liu2guang 发表于 2019-8-13 16:36
我再469上有实现,你可以参考下

https://github.com/liu2guang/bsp_stm32f469/blob/master/board/drives ...


你这个是DMA是从内存到外设,意在输出信号到SAI,再到音频输出吗?
我现在想要实现的是从外设到内存,将AD采集到的数据,通过DMA获取出来,但是这个地方每次都报错了

Ernest 发表于 2019-8-13 12:54
没有什么特殊要求,欢迎参考 f429的驱动


已经找到,我先学习下

Ernest 发表于 2019-8-13 12:54
没有什么特殊要求,欢迎参考 f429的驱动


F429有实现SAI的驱动?我为什么没有看到呢

Ernest 发表于 2019-8-13 12:54
没有什么特殊要求,欢迎参考 f429的驱动


好的,我去看下

SPI 里面DMA配置如下:
void HAL_SAI_MspInit(SAI_HandleTypeDef* hsai)
{

GPIO_InitTypeDef GPIO_InitStruct;
/* SAI1 */
if(hsai->Instance==SAI1_Block_A)
{
/* Peripheral clock enable */
if (SAI1_client == 0)
{
__HAL_RCC_SAI1_CLK_ENABLE();

/* Peripheral interrupt init*/
HAL_NVIC_SetPriority(SAI1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(SAI1_IRQn);
}
SAI1_client ++;

/**SAI1_A_Block_A GPIO Configuration
PE4 ------> SAI1_FS_A
PE5 ------> SAI1_SCK_A
PE6 ------> SAI1_SD_A
*/
GPIO_InitStruct.Pin = A_LRCK_Pin|A_SCLK_Pin|A_DATA1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF6_SAI1;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

/* Peripheral DMA init*/

hdma_sai1_a.Instance = DMA1_Stream6;
hdma_sai1_a.Init.Request = DMA_REQUEST_SAI1_A;
hdma_sai1_a.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_sai1_a.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_sai1_a.Init.MemInc = DMA_MINC_ENABLE;
hdma_sai1_a.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_sai1_a.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_sai1_a.Init.Mode = DMA_NORMAL;
hdma_sai1_a.Init.Priority = DMA_PRIORITY_VERY_HIGH;
hdma_sai1_a.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_sai1_a) != HAL_OK)
{
Error_Handler();
}

/* Several peripheral DMA handle pointers point to the same DMA handle.
Be aware that there is only one channel to perform all the requested DMAs. */
__HAL_LINKDMA(hsai,hdmarx,hdma_sai1_a);

__HAL_LINKDMA(hsai,hdmatx,hdma_sai1_a);

}
}

回到
顶部

发布
问题

投诉
建议