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/CC3200:CPU 模式下 CC3200的 I2S 配置

Guru**** 2560390 points
Other Parts Discussed in Thread: CC3200

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/618864/ccs-cc3200-i2s-configuration-for-cc3200-in-cpu-mode

器件型号:CC3200

工具/软件: Code Composer Studio

大家好、 

我正在尝试通过电容式麦克风连接到左声道来从 TLV320AIC3106音频编解码器读取 I2S 数据。
下面给出了我的编解码器设置、它已成功写入编解码器、我可以使用 I2C 读回寄存器。

void tlv320aic3106init (void){
AudioCodecPageSelect ((unsigned char) 0x00);
AudioCodecRegWrite ((unsigned char) codec_sw_reset、0x00);
//时钟生成和控制
AudioCodecRegWrite ((unsigned char) codec_clock_generation_control、(unsigned char) 0x02);
AudioCodecRegWrite ((unsigned char) codec_additional_GPIO_control_B、(unsigned char) 0x01);

AudioCodecRegWrite ((unsigned char) codec_gpio1_control、0x28);//在 GPIO1引脚上时钟输出

AudioCodecRegWrite ((unsigned char) codec_sample_rate、0xAA);//0xAA);// fs = fssref/n

AudioCodecRegWrite ((unsigned char) codec_mic_bias _control、(unsigned char) 0xC0);// MIC bias

//选择输入时,在路由输入并为 ADC 加电后取消 PGA 的静音。
AudioCodecRegWrite ((unsigned char) codec_line2L_left_adc_control、0x80);
AudioCodecRegWrite ((unsigned char) codec_line1L_left_adc_control、0x7C);//为左侧 ADC 加电
AudioCodecRegWrite ((unsigned char) codec_left_adc_gpa_gain_control、0x00);//撤消 PGA
}的静音 


我正在尝试在 CPU 模式而非 DMA 模式下初始化 I2S、并使用 ISR 读取数据。
下面是我的 I2S 初始化。

void AudioCaptureRenderConfigure (unsigned char bitsPerSample、
无符号短比特率、
unsigned char noOfChannels、
unsigned char RxTx、
unsigned charDMA)
{
//
//初始化 McASP
//
MAP_PRCMPeripheralClkEnable (PRCM_I2S、PRCM_RUN_MODE_CLK);

unsigned longbitClk;

bitClk = bitsPerSample * bitrate * noOfChannels;
DMA=1;

if (bitsPerSample = 16)
{
MAP_PRCMI2SClockFreqSet (512000);//(bitClk*10);//512000);(I2S_base、(bitClk*10)、bitClk、I2S_SLOT_SIZE_16|
MAP_I2SConfigSetExpClk (I2S_base、512000、bitClk、I2S_SLOT_SIZE_16| I2S_PORT_CPU);//(I2S_base、512000、bitClk、I2S_SLOT_SIZE_16|
}


MAP_I2SIntRegister (I2S_base、I2SIntHandler);
MAP_I2SIntEnable (I2S_BASE、I2S_INT_XDATA);

IF (RxTx = I2S_MODE_RX_TX)
{
MAP_I2SSerializerConfig (I2S_base、I2S_DATA_LINE_1、I2S_SER_MODE_RX、
I2S_INACT_LOW_LEVEL);
}

IF (RxTx 和 I2S_MODE_TX)
{
MAP_I2SSerializerConfig (I2S_base、I2S_DATA_LINE_0、I2S_SER_MODE_TX、
I2S_INACT_LOW_LEVEL);
}


}

I2Shandler 就像下面所示。

void I2SIntHandler (void)
{
unsigned long ulStatus;
unsigned long ulDummy;
//获取中断状态
ulStatus = I2SIntStatus (I2S_base);
//检查是否存在发送中断;如果存在、则将下一个数据写入 TX 缓冲区并确认
//中断
if (ulStatus & I2S_STS_XDATA)
{
I2DataPutNonBlocking (I2S_base、I2S_DATA_LINE_0、0xA5);
I2SIntClear (I2S_base、I2S_STS_XDATA);
I2SIntEnable (I2S_base、I2S_INT_XDATA);
}
//检查是否存在接收中断;如果存在、从 Rx 缓冲区读取数据并确认
//中断
if (ulStatus & I2S_STS_RDATA)
{
I2DataGetNonBlocking (I2S_base、I2S_DATA_LINE_1、ulDummmy);
I2SIntClear (I2S_base、I2S_STS_RDATA);
I2SIntEnable (I2S_base、I2S_INT_XDATA);
}

它不会进入处理程序。 我放置一个断点并尝试进行调试、但控件没有进入处理程序。

我的设置是否正确?

谢谢、此致、

Vishnu Pradeep

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

    我们将对此进行深入研究、并将返回给您!

    谢谢、

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

    您好!

    这是我使用的连接。

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

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

    尊敬的 Vincent:

    我目前尚未使用 RTOS。 我要做的就是从音频编解码器中读取 I2S 数据。 我可以使用示波器在 I2S 位时钟、I2S 字时钟和 I2S 数据线上看到信号。 这意味着 I2S 模块的初始化似乎可以。 问题可能出在 I2S 处理程序初始化和读取数据例程。 我的引脚多路复用器配置是否正确? I2S 数据线配置是否有任何问题?

     谢谢、此致、

    Vishnu Pradeep

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

    请在 pinmux.c 中发布您的 PinMuxConfig 函数、以便我们可以检查您的引脚是否配置正确。

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

    您好!

    感谢您的回复。 这是引脚多路复用配置。

    void
    PinMuxConfig (void)
    {
    //
    //启用外设时钟
    //
    MAP_PRCMPeripheralClkEnable (PRCM_I2S、PRCM_RUN_MODE_CLK);
    MAP_PRCMPeripheralClkEnable (PRCM_UARTA0、PRCM_RUN_MODE_CLK);
    MAP_PRCMPeripheralClkEnable (PRCM_I2CA0、PRCM_RUN_MODE_CLK);
    MAP_PRCMPeripheralClkEnable (PRCM_GPIOA1、PRCM_RUN_MODE_CLK);
    MAP_PRCMPeripheralClkEnable (PRCM_GPIOA2、PRCM_RUN_MODE_CLK);
    
    
    MAP_PRCMPeripheralClkEnable (PRCM_GPIOA0、PRCM_RUN_MODE_CLK);
    MAP_PinTypeGPIO (PIN_60、PIN_MODE_0、false);
    MAP_GPIODirModeSet (GPIOA0_BASE、GPIO_PIN_5、GPIO_DIR_MODE_OUT);
    
    
    
    //
    //为 UART0 UART0_TX 配置 PIN_55
    //
    MAP_PinTypeUART (PIN_55、PIN_MODE_3);
    
    //
    //为 UART0 UART0_RX 配置 PIN_57
    //
    MAP_PinTypeUART (PIN_57、PIN_MODE_3);
    
    //
    //为 McASP0 D0配置 PIN_64
    //
    MAP_PinTypeI2S (PIN_64、PIN_MODE_7);//PIN_MODE_7
    
    //
    //为 McASP0 McAFSX CLK 配置 PIN_62
    //
    MAP_PinTypeI2S (PIN_62、PIN_MODE_13);
    
    //
    //为 McASP0 wclk (SYNC)配置 PIN_63
    
    //
    MAP_PinTypeI2S (PIN_63、PIN_MODE_7);
    
    //
    //为 McASP0 D1配置 PIN_50
    //
    MAP_PinTypeI2S (PIN_50、PIN_MODE_6);//PIN_MODE_6
    
    //
    //为 I2C0 I2C_SCL 配置 PIN_01
    //
    MAP_PinTypeI2C (PIN_01、PIN_MODE_1);
    
    //
    //为 I2C0 I2C_SDA 配置 PIN_02
    //
    MAP_PinTypeI2C (PIN_02、PIN_MODE_1);
    
    //
    //为 GPIOInput 配置 PIN_04
    //
    MAP_PinTypeGPIO (PIN_04、PIN_MODE_0、false);
    MAP_GPIODirModeSet (GPIOA1_base、0x20、GPIO_DIR_MODE_IN);
    
    //
    //为 GPIOInput 配置 PIN_15
    //
    MAP_PinTypeGPIO (PIN_15、PIN_MODE_0、false);
    MAP_GPIODirModeSet (GPIOA2_base、0x40、GPIO_DIR_MODE_IN);
    
    
    asm (" NOP");
    } 

    谢谢、此致、

    Vishnu

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

    您是否尝试使用启用 RX 中断 I2SIntEnable (I2S_base、I2S_INT_RDATA);而不是 I2SIntEnable (I2S_base、I2S_INT_XDATA);

    您还在调用 I2SEnable()吗?

    此致、

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

    尊敬的 Vince:

    感谢您的回答。 我错过了添加这个"I2SIntEnable (I2S_base、I2S_INT_RDATA)"函数。 现在、接收器件在进入 ISR 时似乎工作正常。

    如何从 CC3200向从设备发送数据。 我能否使用 I2SDataPut (I2S_base、I2S_DATA_LINE_0、0xA0);只需在主函数中检查传输部件是否正常工作?
    如何利用发送中断发送数据?

    谢谢、此致、
    Vishnu Pradeep

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、您应该能够使用该函数发送数据。 我相信 TX 中断将在您发送数据后触发。 如需更多信息、请阅读 TRM 中的 I2S 部分:

    www.ti.com/.../swru367c.pdf

    此致、

    Vince Rodriguez