This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/CC3200MOD:TIDrivers CC3200 I2S、播放 FS 的声音时出现问题

Guru**** 1963975 points
Other Parts Discussed in Thread: TLV320AIC3254, CC3200, CC3200SDK, SYSBIOS
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/565264/rtos-cc3200mod-tidrivers-cc3200-i2s-issue-playing-sound-from-fs

器件型号:CC3200MOD
主题中讨论的其他器件:TLV320AIC3254CC3200CC3200SDKSYSBIOS

工具/软件:TI-RTOS

您好!
 我们在 CC3200上遇到 I2S 问题。 我们正在尝试播放来自 SimpleLink 文件系统的声音文件(16位、立体声、16kHz 采样)。 该文件似乎从文件系统中读出正常、但 TLV320AIC3254 DAC 没有声音、我们在完成后遇到 DMAERR 中断。 在使用 TIDriver 库进行测试之前、我们已经让它正常工作。 我知道 DAC 设置正确、因为我们使用与原始测试平台相同的寄存器配置和代码(使用 I2C_Open、I2C_transfer 等)。 我附上了以下代码

TIRTOS:2.16.00.08
TIDrivers CC32xx:2.16.00.08
CC3200SDK:1.2.0
SYSBIOS 版本:v6.45.01.29
CC3200 SDK 版本:1.2.0
CC3200服务包: 1.0.1.6-2.7.0.0
unsigned short fileBuffer[30*1024];
_u8 tBuffer[3072];

int playSound (char * filename)
{
intoffset= 0;
长 DeviceFileHandle;
长 lRetVal =-1; //负值为错误
SlfsFileInfo_t pFsFileInfo;
I2S_BufDesc bufDesc[3];
I2S_BufDesc *pDesc =空;
char fil[]="ding.wav";

Semaphore_pend (slSemaphore、BIOS_wait_forever);//等待 NWP 访问 FS
Semaphore_pend (semWaterWal Handle、BIOS_WAIT_Forever);//等待 I2S 句柄被打开

System_printf ("sound:Playing");

/DeviceName

(s_Open)、'FileName (\n'sle_unsigned


文件名);//系统文件名(\null_unsigned (1);//文件名:
返回-1;
}
//从文件中读取并丢弃 wav 头
//获取有关文件
的信息 lRetVal = sl_FsGetInfo ((unsigned char *)&fil、NULL、&pFsFileInfo);
if (lRetVal < 0)
{
CloseSoundFile (DeviceFileHandle);
//System_Handf ("sound:&ppseFileInfo);'n
、从


文件中读取%tsL 文件时失败;%tFileName = 0;//从文件中返回
if (lRetVal < 0)
{
CloseSoundFile (DeviceFileHandle);
//System_printf ("声音:无法读取文件%s\n"、文件名);
返回-1;
}
//丢弃 wav 头
//读取头
//检查文件是否为 wav 文件
,如果((tBuffer[0]!='R'
|| tBuffer[1]!='I'
|| tBuffer[2]!='F'
|| tBuffer[3]!='F')
{
System_printf ("error:not Devicefile\n"};
“SoundHandle"文件
名:%wav 文件格式:%wav 文件失败;
返回文件名

system_printf ("声音:声音是 RIFF wave\n");

偏移量+= sizeof (waveHeaderType);

_u8 * ptr = fileBuffer;

bufDesc[0]。bufPtr = ptr;
bufDesc[0]。bufSize = 3072;

ptr += 1536;
bufDesc[1];bufPtr = ptr;bufPtr = ptr =
bufDesc[1].bufSize = 3072;

ptr += 1536;
bufDesc[2].bufPtr = ptr;
bufDesc[2].bufSize = 3072;

ptr = fileBuffer;
System_printf ("ptr:%x\n"、ptr);

sl_FsRead (DeviceFileHandle、offset、tBuffer、 3072);
memcpy (bufDesc[0].bufPtr、tBuffer、3072);
sl_FsRead (DeviceFileHandle、 偏移、tBuffer、3072);
memcpy (bufDesc[1].bufPtr、tBuffer、 3072);
sl_FsRead (DeviceFileHandle、偏移量、tBuffer、3072);
memcpy (bufDesc[2]。bufPtr、tBuffer、3072);

I2S_writeIssue (i2sHandle、&bufDesc[0]);
I2S_writeIssue (i2sHandle、&bufDesc[1]);
I2S_writeIssue (i2sHandle、 &bufDesc[2]);

同步读取= 0;
内部 I = 2;
while (!donesReading){
i++;
ptr += 1536;
if (i=10){
ptr = fileBuffer;
i = 0;
}
I2S_writeReclaim (i2sHandle、&pDesc);
if (pVal ==

NULL);while (DeviceReset1)、FileReclaim (i2sHandle = NULL);if (文件缓冲区1);(文件交换)
if (lRetVal < 0)
{
CloseSoundFile (DeviceFileHandle);
System_printf ("声音:无法读取文件%s\n"、文件名);
}
否则(lRetVal < 3072)
{
Reading = 1;
}
//System_printf ("ptr:%x\n"、ptr);
cpy、memBuffer (ptr) lSoundVal);

pDESC->bufPtr = ptr;
pDESC->bufSize = lRetVal<3072?lRetVal:3072;
I2S_writeIssue (i2sHandle、pDesc);
offset+=lRetVal;
}

System_printf ("声音:完成播放。\n");
CloseFileHandle

返回

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Greg、

    请澄清一下…  当您不使用 SimpleLink 文件系统获取缓冲区时,是否能够使用 I2S 驱动程序播放声音?  是否只有当您尝试同时使用这两者时才没有声音?

    此外,您能否发布初始化 I2S 参数并调用 I2S_open()的代码?

    谢谢、
    Scott

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Scott、

    无论哪种方式、我都听不到声音。 我刚刚使用转换为静态 C 阵列的16位16000Hz 采样率立体声正弦波进行了测试。 然后、在使用上述代码之前、我将此数组存储到引用它的大缓冲区中。 我无法从编解码器中获得声音。 我已附加设置功能。 我还在将 OPERATMODE 设置为 I2S_OPMODE_TX_ONLY 的情况下对此进行了测试。

    我知道编解码器正在 I2C 上设置、因为我们可以与总线上的其他器件通信、并且寄存器可以正确回读。

    void setupSound()
    {
    ERROR_Block EB;
    ERROR_INIT (&EB);
    
    Semaphore_Params_init (semWaterMark);
    semWaterMark.mode = Semaphore_Mode_binary;
    semWaterMarkHandle = semaphore_create (0、semWaterMark、&EB);
    
    //初始化编码
    I2SSound_init();//设置编解码器
    
    //设置 I2S 参数
    I2S_PARAMS_INIT (&i2sParams);
    I2SCC3200DMA_PARAMS_INIT (&I2SCC3200DMA_serialParams);
    i2sParams.customParams =(uintptr_t)&I2SCC3200DMA_serialParams;
    i2sParams.operationMode = I2S_OPMODE_TX_RX_SYNC;
    i2sHandle = I2S_open (Board_I2S0、&i2sParams);
    if (i2sHandle < 0)
    {
    system_printf ("sound:无法打开 I2S\n");
    }
    } 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Greg、

    好的、谢谢。

    您使用的是 TI Launchpad、还是在定制电路板上?  TI-RTOS 2.16.00.08版本中有一个“I2S Echo”示例,我想知道您是否已经尝试过这种情况?  此示例要求在 Launchpad 上安装 Booster Pack。  如果您有不同的设置、请查看此示例以供参考。

    我与另一位工程师讨论了您所报告的内容、他说过要确保 RX 和 TX 缓冲区是32位(4字节)对齐的。  如果它们不是这样,可能会解释您看到的 DMA 错误。  在您的代码片段 fileBuffer 中,类型为“unsigned short”。  我想如果您使用“无符号”,那就可以这么做。

    希望这对您有所帮助...

    此致、
    Scott

x 出现错误。请重试或与管理员联系。