OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5634|回复: 9

关于sai配置问题

[复制链接]

14

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2018-10-11
在线时间
24 小时
发表于 2019-1-6 14:17:56 | 显示全部楼层 |阅读模式
5金钱
最近在做关于音频的项目,项目是这样的和ath8809通信,用sai接口,时钟频率为256k,采样率为8k,stm32f767做为从设备,采用pcm短帧格式,单声道,发现通信一段时间,出现帧滞后的现象,不知道我哪配置的不对,下面是我的代码,哪位大佬可以指点我一下,谢谢啦(通过示波器抓取ath8809给我发来的数据,是一帧32位,只有前16位有效,后面全是0)

        HAL_SAI_DeInit(&sai1b_handler);
        sai1b_handler.Instance = SAI1_Block_B;
        sai1b_handler.Init.AudioMode = SAI_MODESLAVE_RX;
        sai1b_handler.Init.Synchro = SAI_SYNCHRONOUS;
        sai1b_handler.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE;
        sai1b_handler.Init.NoDivider = SAI_MASTERDIVIDER_DISABLE;
        sai1b_handler.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_1QF;
        sai1b_handler.Init.MonoStereoMode = SAI_MONOMODE;
        sai1b_handler.Init.Protocol = SAI_FREE_PROTOCOL;
        sai1b_handler.Init.DataSize = SAI_DATASIZE_16;
        sai1b_handler.Init.FirstBit = SAI_FIRSTBIT_MSB;
        sai1b_handler.Init.ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE;
        sai1b_handler.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_8K;
       
        sai1b_handler.FrameInit.FrameLength = 32;
        sai1b_handler.FrameInit.ActiveFrameLength = 1;
        sai1b_handler.FrameInit.FSDefinition = SAI_FS_STARTFRAME;
        sai1b_handler.FrameInit.FSPolarity = SAI_FS_ACTIVE_HIGH;
        sai1b_handler.FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT;
       
        sai1b_handler.SlotInit.FirstBitOffset = 0;
        sai1b_handler.SlotInit.SlotSize = SAI_SLOTSIZE_16B;
        sai1b_handler.SlotInit.SlotNumber = 2;
        sai1b_handler.SlotInit.SlotActive = SAI_SLOTACTIVE_0|SAI_SLOTACTIVE_1;
        HAL_SAI_Init(&sai1b_handler);
        saib_dma_enable();
//        __HAL_SAI_CLEAR_FLAG(&sai1b_handler,SAI_FLAG_AFSDET);
//        __HAL_SAI_CLEAR_FLAG(&sai1b_handler,SAI_FLAG_LFSDET);


        HAL_SAI_DeInit(&sai1a_handler);
        sai1a_handler.Instance = SAI1_Block_A;
        sai1a_handler.Init.AudioMode = SAI_MODESLAVE_TX;
        sai1a_handler.Init.Synchro = SAI_ASYNCHRONOUS;
        sai1a_handler.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE;
        sai1a_handler.Init.NoDivider = SAI_MASTERDIVIDER_DISABLE;
        sai1a_handler.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_1QF;
        sai1a_handler.Init.MonoStereoMode = SAI_MONOMODE;
        sai1a_handler.Init.Protocol = SAI_FREE_PROTOCOL;
        sai1a_handler.Init.DataSize = SAI_DATASIZE_16;
        sai1a_handler.Init.FirstBit = SAI_FIRSTBIT_MSB;
        sai1a_handler.Init.ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE;
        sai1a_handler.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_8K;
       
        sai1a_handler.FrameInit.FrameLength = 32;
        sai1a_handler.FrameInit.ActiveFrameLength = 1;
        sai1a_handler.FrameInit.FSDefinition = SAI_FS_STARTFRAME;
        sai1a_handler.FrameInit.FSPolarity = SAI_FS_ACTIVE_HIGH;
        sai1a_handler.FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT;
       
        sai1a_handler.SlotInit.FirstBitOffset = 0;
        sai1a_handler.SlotInit.SlotSize = SAI_SLOTSIZE_16B
        sai1a_handler.SlotInit.SlotNumber = 2;
        sai1a_handler.SlotInit.SlotActive = SAI_SLOTACTIVE_0|SAI_SLOTACTIVE_1;
       
        HAL_SAI_Init(&sai1a_handler);
        saia_dma_enable();

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-1-7 01:59:03 | 显示全部楼层
那是你数据传输的延时,和sai无关
回复

使用道具 举报

14

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2018-10-11
在线时间
24 小时
 楼主| 发表于 2019-1-7 15:54:05 | 显示全部楼层
正点原子 发表于 2019-1-7 01:59
那是你数据传输的延时,和sai无关

可是我拿示波器抓ath8809给我的FS频率,都是在7.999k_8.001k之间啊,没有FS延迟的情况啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-1-8 02:27:13 | 显示全部楼层
随遇而安丶 发表于 2019-1-7 15:54
可是我拿示波器抓ath8809给我的FS频率,都是在7.999k_8.001k之间啊,没有FS延迟的情况啊

那你直接用8809接DAC试试?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
286
金钱
286
注册时间
2018-12-31
在线时间
12 小时
发表于 2019-1-8 08:27:37 | 显示全部楼层
挺好的啊! 不错啊!
回复

使用道具 举报

14

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2018-10-11
在线时间
24 小时
 楼主| 发表于 2019-1-9 11:20:02 | 显示全部楼层
正点原子 发表于 2019-1-8 02:27
那你直接用8809接DAC试试?

我怀疑是DMA冲突了,我是发送和接收都开启DMA模式的,用的是直接模式,我想问一下,如果我的接收数据的DMA优先级低,接收到的数据会放到到DMA的FIFO中,假如我第二个数据来了,他会把原先存在FIFO的值覆盖掉吗
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-1-10 02:51:09 | 显示全部楼层
随遇而安丶 发表于 2019-1-9 11:20
我怀疑是DMA冲突了,我是发送和接收都开启DMA模式的,用的是直接模式,我想问一下,如果我的接收数据的DM ...

DMA的FIFO 是硬件控制的,不会覆盖,但是你必须有目标地址,他会自动搬运到目标地址
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

14

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2018-10-11
在线时间
24 小时
 楼主| 发表于 2019-1-10 09:49:29 | 显示全部楼层
昨天,我试了拿两个开发板进行通信(sai接口),一个做为主,一个做为从,从机还是出现帧滞后的情况
回复

使用道具 举报

14

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2018-10-11
在线时间
24 小时
 楼主| 发表于 2019-1-10 09:51:49 | 显示全部楼层
正点原子 发表于 2019-1-10 02:51
DMA的FIFO 是硬件控制的,不会覆盖,但是你必须有目标地址,他会自动搬运到目标地址

昨天,我试了拿两个开发板进行通信(sai接口),一个做为主,一个做为从,从机还是出现帧滞后的情况,没有用DMA模式,主机就是循环发送,从机循环接收
回复

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-5-23
在线时间
6 小时
发表于 2020-4-10 06:42:26 来自手机 | 显示全部楼层
楼主搞定没
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-2 17:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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