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.

[参考译文] CCS/CC3220SF-LAUNCHXL:无法使 I2S 在读取/写入(回调)非阻塞模式下工作

Guru**** 2533390 points
Other Parts Discussed in Thread: CC3200, CC3220SF-LAUNCHXL, CC3220SF

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/762399/ccs-cc3220sf-launchxl-cannot-get-i2s-to-work-in-read-write-callback-non-blocking-mode

器件型号:CC3220SF-LAUNCHXL
主题中讨论的其他器件: CC3200CC3220SF

工具/软件:Code Composer Studio

您好!

我要将使用实时音频的北向应用从 CC3200迁移到使用 TI CC3200AUDBOOST 的 CC3220SF-LAUNCHXL 、并在使 I2S 正常工作时遇到问题。

我已经开始在 CC3220 SDK (2.30.00.05)中进行'power_measuration' nortos 演示以使应用的网络端正常工作、并成功地将 i2c 代码从 driverlib 更改为驱动程序。

该应用程序使用 I2S driverlib 代码为 CC3220SF-LAUNCHXL 编译、看起来运行正常、但无音频、且在具有示波器的音频 BOOST 板上的 DIN 引脚(P3-9)上没有测量活动。

我从 TIRTOS 'i2secho'示例中获取了代码、该示例使用 I2S 问题/回收阻止函数并工作到某个点、但延迟太大(包括在 i2secho 示例本身中)。

我找不到 I2S 驱动器在非阻塞回调模式下工作的示例-我将以下代码片段放入我的应用程序中-编译正常、运行正常、写入函数返回0 (无错误)、 但是回调永远不会触发、并且在连接到 AUDIBOOST 板上 DIN 的范围上没有任何活动。

有人可以向我介绍 I2S 的读/写模式工作示例、还是指出以下代码片段出错的地方?

非常感谢

Chris

#include 
#include 
#include 

I2SCC32XXDMA_SerialPinParams I2SCC32XXDMA_serialParams;
I2S_Params i2sParams;

void i2sWriteCallback (I2S_Handle handle、I2S_BufDesc){

printf (















"着陆于此处-写入回调\n");}void i2sWriteCalls (i2s\cle_params (i2i2prefHandle)*、i2pref2 i2pC (i2i2pref_clams (i2i2i2i2i2prefC)、i2pref_clams (i2i2prefC)、i2pref_reams (i2pref_cliptle)、i2pref_clams (i2pref_clams (i2i2pref_clams)、i2pref

if (i2cHandle == NULL){
//将 I2C 初始

















化时出错(1);}//配置音频编解码器配置 AudioCodec (codec_I2S_WORD_LEN_24);I2S_init ();I2S_PARAMS_INIT (&i2sRAM);I2SC32XX_PARAMS_IPS_REACM=I2CORECORE_I2ON_I2S;I2CORE_PARAMS_CALL_I2ORMS = I2CORECORECORE_PILOADMORMS = I2CORECORE_PILL_I2ON_PILOAD_PIREADMS.PIOSC_PIOSC_PIOSC_PALMS_PIREADMS.OSS_PALMS_I2ORMS;I2ORMS = I2ON_RESPRAMORMS = I2CORECORECORE_PIREADMORE_PIREAD_PIREADMS.OSS_PALMS_PI
i2sParams.readCallback = i2sReadCallback;

i2sHandle = I2S_open (Board_I2S0、&i2sParams);

if (i2sHandle == NULL){
// Error Initializing I2S
while (1);
}

I2S_BufcallbackBuffer;

const buffer['hello]1

callbackbytes'(hello


=无符号反向缓冲区);while 1 calls2calls
= iphello (hello)


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

    尊敬的 Chris:

    查看您的代码、您将需要修复几个错误。

    1. 由于 I2S_write()需要 I2S_BufDesc*,而不是您提供的 I2S_BufDesc,所以您上面发布的代码不会编译。 将 I2S_write()调用更改为 bytesWritten = I2S_write (i2sHandle、&callbackBuffer);修复了这一点。
    2. 请确保您传递给 I2S_write()的数据是32位对齐的。为此,您应该将缓冲区数组声明为 unit32_t 数组,以确保数据缓冲区正确对齐。

    实施这两个修复会导致以下代码:

    void mainThread (void *pvParameters)
    {
    I2C_init();
    InitTerm();
    int bytesWritten;
    I2C_Params i2cParams;
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    i2cHandle = I2C_open (Board_I2C0、&i2cParams);
    
    if (i2cHandle == NULL){
    //初始化 I2C 时出错
    while (1);
    }
    
    //配置音频编解码器
    配置音频编解码器(CODEC _I2S_WORD_LEN_24);
    
    
    I2S_init();
    
    I2S_PARAMS_INIT (&i2sParams);
    I2SCC32XXDMA_PARAMS_INIT (&I2SCC32XXDMA_serialParams);
    i2sParams.customParams =(void *)&I2SCC32XXDMA_serialParams;
    i2sParams.operationMode = I2S_OPMODE_TX_RX_SYNC;
    
    i2sParams.readMode = I2S_MODE_CALLBACK;
    i2sParams.writeMode = I2S_MODE_CALLBACK;
    
    i2sParams.writeCallback = i2sWriteCallback;
    i2sParams.readCallback = i2sReadCallback;
    
    i2sHandle = I2S_open (Board_I2S0、&i2sParams);
    
    if (i2sHandle == NULL){
    //初始化 I2S 时出错
    while (1);
    }
    
    I2S_BufDesc callbackBuffer;
    
    //const unsigned char hello[]="hello world";
    uint32_t testBuffer[128];
    memset (testBuffer、0、sizeof (testBuffer));
    
    while (1){
    callbackBuffer.bufPtr = testBuffer;
    callbackBuffer.bufSize = sizeof (testBuffer);
    字节 Written = I2S_WRITE (i2sHandle、&callbackBuffer);
    
    }
    } 

    请告诉我、您是否需要进一步澄清或对此主题有进一步的问题。

    此致、
    Michael

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

    感谢 Michael 的答复 、但遗憾的是、它没有解决这个问题。

    当应用启动时、CC3220AUDBOOST 的 DIN 引脚上现在有一个脉冲、回写仅触发一次、但不再触发。 代码仍在 while (1)循环中运行、但 DIN 引脚或写回方法中没有其他活动。

    在发送更多数据之前、它几乎看起来需要读取/重置某个内容、即使它是一种非阻塞方法?

    非常感谢

    Chris

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

    不幸的是、我仍然无法使其正常工作-只需获取一个写入和一个写入回调、其他什么都没有。

    基于程序仍在 while (1)循环周围运行、字节写入变量返回为零(就像写入成功一样)、我尝试在写入之间的循环中加一个延迟、但这没有什么区别。

    我还在查看特定于硬件的 I2S 文件 I2SCC32XXDMA.c、并看到了此代码、不确定读写函数是否与特定于硬件的文件中的函数无关?

    /* I2SCC32XXDMA 函数*/
    void I2SCC32XXDMA_Close (I2S_Handle handle);
    int_fast16_t I2SCC32XXDMA_control (I2S_Handle handle、uint_fast16_t cmd、
    void *arg);
    void I2SCC32XXDMA_init (I2S_Handle handle);
    I2S_Handle I2SCC32XXDMA_open (I2S_Handle handle、I2S_Params *参数);
    int_fast16_t I2SCC32XXDMA_readIssuee (I2S_Handle handle、I2S_BufDesc *描述);
    size_t I2SCC32XXDMA_readReclaim (I2S_Handle handle、I2S_BufDesc);
    int_fast16_t I2SCC32XXDMA_writeIssuee (I2S_Handle handle、I2S_BufDesc);
    size_t I2SCC32XXDMA_writeReclaim (I2S_Handle handle、I2S_BufDesc);
    
    // I2SCC32XXDMA 实现的 I2S 函数表*/
    const I2S_FxnTable I2SCC32XXDMA_fxnTable ={
    I2SCC32XXDMA_CLOSE、
    I2SCC32XXDMA_CONTROL、
    I2SCC32XXDMA_init、
    I2SCC32XXDMA_open、
    I2SCC32XXDMA_readIssue,
    I2SCC32XXDMA_readReclAIM、
    I2SCC32XXDMA_writeIssuee、
    I2SCC32XXDMA_writeReclAIM
    }; 

    提前感谢您的任何帮助/指导。

    Chris

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

    您好!

    不幸的是,我仍然没有成功。

    我已经尝试在 I2S_WRITE 之后的 while 环路中添加 I2S_READ

    字节 Written = I2S_WRITE (i2sHandle、&callbackBuffer);
    字节 Read = I2S_READ (i2sHandle、&callbackReadBuffer); 

    在这里、我仍然会得到一个 WRITE_CALLACK 方法的单个触发器。 如果我移除 I2S_WRITE 并在循环中仅让 I2S_READ 触发 READ_CALLBACK、但又只会触发一次。

    在这两种方法中、似乎有什么东西被阻止?

    任何帮助/支持/指导都将不胜感激。

    Chris

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

    尊敬的 Chris:

    在获取 I2S_DEMO 示例并将 I2S 读取/写入修改为回调模式后、我似乎不会遇到与您相同的问题。 查看我随附的 i2secho.c 文件以了解我正在运行的内容。 我得到了预期的回写消息、逻辑分析仪上的一切看起来都是正确的。

    请注意、您还需要在项目中包含 UART_TERm.c 和 uart_term.h、以便构建所有内容。 这是因为我为使用 UART 调试输出的 UART_PRINT()语句交换了 printf()语句。 您可以在中找到这些文件的副本 /examples/rtos/CC3220SF_LAUNCHXL/demos/network_terminal

    如果您构建并运行我拥有的 i2secho 文件、那么在您的终端上是否一切正常?

    /cfs-file/__key/communityserver-discussions-components-files/968/i2secho.c

    此致、

    Michael

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

    您好、Michael、

    是的、这解决了问题、谢谢。 我确定我在没有 printf 的情况下尝试了我的代码(...) 回调中的行未成功、因此我需要查看我可能错过的其他内容-主要是写入函数现在在我的代码中正常工作。

    现在、我需要让我的头进入 I2S_READ 函数(无法获取我在 TI 网站上找到的示例)、但如果需要、我将提出一个新问题。

    谢谢

    Chris