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/TMS320C5545:如何在 ROM 中进行编程?

Guru**** 2614265 points
Other Parts Discussed in Thread: PCM5142

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/654878/ccs-tms320c5545-how-can-i-program-in-rom

器件型号:TMS320C5545

工具/软件:Code Composer Studio

大家好、我正在使用 C5545 DSP。

我想在 ROM 中进行编程。 但我不能。

这是 C5545的原始 cmd 文件。 它工作正常。  

----------------------------------

存储器

MMR:O = 0x000000 l = 0x0000c0 /* 192B 存储器映射寄存器*/
DARAM0:O = 0x0000C0 l = 0x001F40 // 8kB 双存取 RAM 0 */
DARAM1:O = 0x002000 l = 0x002000 // 8kB 双存取 RAM 1 */
DARAM2:O = 0x004000 l = 0x002000 // 8kB 双存取 RAM 2 */
DARAM3:O = 0x006000 l = 0x002000 // 8kB 双存取 RAM 3 */
DARAM4:O = 0x008000 l = 0x002000 // 8kB 双存取 RAM 4 */
DARAM5:O = 0x00A000 l = 0x004000 // 8kB 双存取 RAM 5 */
// DARAM6:O = 0x00C000 l = 0x002000 // 8kB 双存取 RAM 6 */
DARAM7:O = 0x00E000 l = 0x002000 // 8kB 双存取 RAM 7 *

SARAM0:O = 0x010000 l = 0x002000 // 8kB 单访问 RAM 0 */
SARAM1:O = 0x012000 l = 0x002000 // 8kB 单访问 RAM 1 */
SARAM2:O = 0x014000 l = 0x002000 // 8kB 单次访问 RAM 2 *
SARAM3:O = 0x016000 l = 0x002000 // 8kB 单访问 RAM 3 *
SARAM4:O = 0x018000 l = 0x002000 // 8kB 单访问 RAM 4 *
SARAM5:O = 0x01A000 l = 0x002000 // 8kB 单存取 RAM 5 */
SARAM6:O = 0x01C000 l = 0x002000 // 8kB 单存取 RAM 6 */
SARAM7:O = 0x01E000 l = 0x002000 // 8kB 单次访问 RAM 7 *
SARAM8:O = 0x020000 l = 0x002000 // 8kB 单访问 RAM 8 */
SARAM9:O = 0x022000 l = 0x002000 // 8kB 单访问 RAM 9 */
SARAM10:O = 0x024000 l = 0x002000 // 8kB 单访问 RAM 10 */
SARAM11:O = 0x026000 l = 0x002000 // 8kB 单访问 RAM 11 *
SARAM12:O = 0x028000 l = 0x002000 // 8kB 单访问 RAM 12 *
SARAM13:O = 0x02A000 l = 0x002000 // 8kB 单访问 RAM 13 */
SARAM14:O = 0x02C000 l = 0x002000 // 8kB 单访问 RAM 14 *
SARAM15:O = 0x02E000 l = 0x002000 // 8kB 单访问 RAM 15 */
SARAM16:O = 0x030000 l = 0x002000 // 8kB 单访问 RAM 16 */
SARAM17:O = 0x032000 l = 0x002000 // 8kB 单次访问 RAM 17 *
SARAM18:O = 0x034000 l = 0x002000 // 8kB 单访问 RAM 18 *
SARAM19:O = 0x036000 l = 0x002000 // 8kB 单访问 RAM 19 *
SARAM20:O = 0x038000 l = 0x002000 // 8kB 单访问 RAM 20 *
SARAM21:O = 0x03A000 l = 0x002000 // 8kB 单次访问 RAM 21 *
SARAM22:O = 0x03C000 l = 0x002000 // 8kB 单次访问 RAM 22 *
SARAM23:O = 0x03E000 l = 0x002000 // 8kB 单存取 RAM 23 *
SARAM24:O = 0x040000 l = 0x002000 // 8kB 单次访问 RAM 24 */
SARAM25:O = 0x042000 l = 0x002000 // 8kB 单存取 RAM 25 *
SARAM26:O = 0x044000 l = 0x002000 // 8kB 单次访问 RAM 26 */
SARAM27:O = 0x046000 l = 0x002000 // 8kB 单次访问 RAM 27 *
SARAM28:O = 0x048000 l = 0x002000 // 8kB 单访问 RAM 28 *
SARAM29:O = 0x04A000 l = 0x002000 // 8kB 单访问 RAM 29 */
SARAM30:O = 0x04C000 l = 0x002000 // 8kB 单访问 RAM 30 */
SARAM31:O = 0x04E000 l = 0x002000 // 8kB 单访问 RAM 31 *

///ROM:O = 0xFE0000 l = 0x01FF00 /* 128KB ROM (MPNMC=0)或 CS5 (MPNMC=1)*/
SAROM0:O = 0xFE0000 l = 0x008000 // 128KB ROM (MPNMC=0)或 CS5 (MPNMC=1)*/
SAROM1:O = 0xFE8000 l = 0x008000 // 128KB ROM (MPNMC=0)或 CS5 (MPNMC=1)*/
SAROM2:O = 0x0000 l = 0x008000 // 128KB ROM (MPNMC=0)或 CS5 (MPNMC=1)*/
SAROM3:O = 0xFF8000 l = 0x002000 // 128KB ROM (MPNMC=0)或 CS5 (MPNMC=1)*/

VECS:O = 0xFFFFFF00 l = 0x000100 //复位向量*/


部分

VECS (空载)> VECS
.cinit > DARAM0
.text >> SARAM0|SARAM1|SARAM2|SARAM3|SARAM4
.stack > DARAM0
.sysstack > DARAM0
.sysmem > DARAM4
.data > DARAM4
.cio > DARAM0
.bss > DARAM5
.const > DARAM0
.switch > DARAM7

----------------------------------------------------

这是修改后的 cmd 文件。

----------------------------------------

存储器

MMR:O = 0x000000 l = 0x0000c0 /* 192B 存储器映射寄存器*/
DARAM0:O = 0x0000C0 l = 0x001F40 // 8kB 双存取 RAM 0 */
DARAM1:O = 0x002000 l = 0x002000 // 8kB 双存取 RAM 1 */
DARAM2:O = 0x004000 l = 0x002000 // 8kB 双存取 RAM 2 */
DARAM3:O = 0x006000 l = 0x002000 // 8kB 双存取 RAM 3 */
DARAM4:O = 0x008000 l = 0x002000 // 8kB 双存取 RAM 4 */
DARAM5:O = 0x00A000 l = 0x004000 // 8kB 双存取 RAM 5 */
// DARAM6:O = 0x00C000 l = 0x002000 // 8kB 双存取 RAM 6 */
DARAM7:O = 0x00E000 l = 0x002000 // 8kB 双存取 RAM 7 *

SARAM0:O = 0x010000 l = 0x002000 // 8kB 单访问 RAM 0 */
SARAM1:O = 0x012000 l = 0x002000 // 8kB 单访问 RAM 1 */
SARAM2:O = 0x014000 l = 0x002000 // 8kB 单次访问 RAM 2 *
SARAM3:O = 0x016000 l = 0x002000 // 8kB 单访问 RAM 3 *
SARAM4:O = 0x018000 l = 0x002000 // 8kB 单访问 RAM 4 *
SARAM5:O = 0x01A000 l = 0x002000 // 8kB 单存取 RAM 5 */
SARAM6:O = 0x01C000 l = 0x002000 // 8kB 单存取 RAM 6 */
SARAM7:O = 0x01E000 l = 0x002000 // 8kB 单次访问 RAM 7 *
SARAM8:O = 0x020000 l = 0x002000 // 8kB 单访问 RAM 8 */
SARAM9:O = 0x022000 l = 0x002000 // 8kB 单访问 RAM 9 */
SARAM10:O = 0x024000 l = 0x002000 // 8kB 单访问 RAM 10 */
SARAM11:O = 0x026000 l = 0x002000 // 8kB 单访问 RAM 11 *
SARAM12:O = 0x028000 l = 0x002000 // 8kB 单访问 RAM 12 *
SARAM13:O = 0x02A000 l = 0x002000 // 8kB 单访问 RAM 13 */
SARAM14:O = 0x02C000 l = 0x002000 // 8kB 单访问 RAM 14 *
SARAM15:O = 0x02E000 l = 0x002000 // 8kB 单访问 RAM 15 */
SARAM16:O = 0x030000 l = 0x002000 // 8kB 单访问 RAM 16 */
SARAM17:O = 0x032000 l = 0x002000 // 8kB 单次访问 RAM 17 *
SARAM18:O = 0x034000 l = 0x002000 // 8kB 单访问 RAM 18 *
SARAM19:O = 0x036000 l = 0x002000 // 8kB 单访问 RAM 19 *
SARAM20:O = 0x038000 l = 0x002000 // 8kB 单访问 RAM 20 *
SARAM21:O = 0x03A000 l = 0x002000 // 8kB 单次访问 RAM 21 *
SARAM22:O = 0x03C000 l = 0x002000 // 8kB 单次访问 RAM 22 *
SARAM23:O = 0x03E000 l = 0x002000 // 8kB 单存取 RAM 23 *
SARAM24:O = 0x040000 l = 0x002000 // 8kB 单次访问 RAM 24 */
SARAM25:O = 0x042000 l = 0x002000 // 8kB 单存取 RAM 25 *
SARAM26:O = 0x044000 l = 0x002000 // 8kB 单次访问 RAM 26 */
SARAM27:O = 0x046000 l = 0x002000 // 8kB 单次访问 RAM 27 *
SARAM28:O = 0x048000 l = 0x002000 // 8kB 单访问 RAM 28 *
SARAM29:O = 0x04A000 l = 0x002000 // 8kB 单访问 RAM 29 */
SARAM30:O = 0x04C000 l = 0x002000 // 8kB 单访问 RAM 30 */
SARAM31:O = 0x04E000 l = 0x002000 // 8kB 单访问 RAM 31 *

///ROM:O = 0xFE0000 l = 0x01FF00 /* 128KB ROM (MPNMC=0)或 CS5 (MPNMC=1)*/
SAROM0:O = 0xFE0000 l = 0x008000 // 128KB ROM (MPNMC=0)或 CS5 (MPNMC=1)*/
SAROM1:O = 0xFE8000 l = 0x008000 // 128KB ROM (MPNMC=0)或 CS5 (MPNMC=1)*/
SAROM2:O = 0x0000 l = 0x008000 // 128KB ROM (MPNMC=0)或 CS5 (MPNMC=1)*/
SAROM3:O = 0xFF8000 l = 0x002000 // 128KB ROM (MPNMC=0)或 CS5 (MPNMC=1)*/

VECS:O = 0xFFFFFF00 l = 0x000100 //复位向量*/


部分

VECS (空载)> VECS  
.cinit > SAROM0
.text > SAROM1
.stack > DARAM0
.sysstack > DARAM0
.sysmem > DARAM4
.data > DARAM4
.cio > DARAM0
.bss > DARAM5

.const > SAROM2
.switch > DARAM7  

--------------------------------------

这会产生误差。

我想知道如何在 ROM 中进行编程

请给我一些提示

谢谢  

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

    我已通知 RTOS 团队。 他们将直接在此处发布反馈。

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

    您无法对器件上的 ROM 进行编程、它是只读的。

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

    如何保存代码数据?

    我想对闪存中的代码进行编程

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

    请参阅此文档、了解如何将映像刷写到 SPI 闪存中。
    processors.wiki.ti.com/.../C5535_Boot-Image_Programr

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

    你(们)好

    实际上、我有一个 I2C EEPROM。

    我想在 I2C EEPROM 中对代码进行编程

    我找到了示例代码"编程器"(C55_LP/C55_csl3.08/Ccs_v6.x_examples)

    *此实用程序允许将用户指定的二进制文件编程到中
    *以下支持的器件之一...
    *@Li NAND 闪存
    *@Li NOR FLASH
    *@Li SPI EEPROM
    *@Li IIC EEPROM
    *@Li MMC
    *@Li SD
    *@Li SPI 闪存
    *@Li MCSPI 闪存

    我从十六进制实用程序创建了十六进制文件。


    但我不知道如何生成二进制文件。

    我可以为代码创建二进制文件吗?

    谢谢你

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


    ****项目 I2S-DMA_PCM_MASTER 的配置调试构建****

    "C:\\ti\\ccsv7\\utils\\bin\\gmake"-k all
    '调用:C5500十六进制实用程序'
    "C:/ti/ccsv7/tools/compiler/c5500_4.4.1/bin/hex55 "--boot -binary -o "CSL_I2S_DMAExpampale_out.hex""CSL_I2S_DMAExpampale_out.out"
    正在转换为二进制格式...
    "CSL_I2S_DMAExpampale_out.out"=>.cinit(引导加载)
    "CSL_I2S_DMAExpampale_out.out"=>.switch(引导加载)
    "CSL_I2S_DMAExpampale_out.out"=>.text.1(引导加载)
    "CSL_I2S_DMAExpampale_out.out"=>.text.2(引导加载)
    "CSL_I2S_DMAExpampale_out.out"=>.text.3(引导加载)
    '完成的构建:CSL_I2S_DMAExpampale_out.hex'
    '

    ****构建完成****


    我得到这个、我得到了十六进制文件。

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

    尊敬的 Minkyo SEO:

    hex55程序会生成二进制文件-您已将其命名为.hex。

    将这些参数标志与 hex55一同使用:hex55 -boot -v5505 -serial8 -b -i bootloader.out -o Bootloader.bin

    我认为将带有标志的命令放入我执行的.bat 文件中会有所帮助。

    然后、要刷写 I2C EEPROM、请使用 C55_CSL\ccs_v6.x_examples\programmer 工程。 (http://www.ti.com/tool/sprc133)

    运行编程器时、CCS 控制台中将出现提示。 键入4表示 IIC EEPROM、键入1表示编程、然后将路径传递到 hex55生成的.bin 文件。 请注意、路径中不得有任何空格、因此在编程前将其移动到 c:\ti\bins 之类的位置。

    您正在尝试对哪些 I2C EEPROM 进行编程? 我们可以确认 I2C 地址与编程器使用的地址相匹配(0x50)。

    希望这对您有所帮助、
    标记

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

    你(们)好

    我做到了。 但它不起作用。

    这是我的设置。

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    我将文件名 hex 更改为 bin。 这是生成结果

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    接下来、我执行了编程器示例。 这是结果。

    我认为编程完成了。 但 DSP 不工作。  

    我的错误是什么?  

    我使用 的是 AT24C512C I2C EEPROM。  

    谢谢你  

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

    尝试编辑标志:而不是-mcbsp8,使用-v5505 -serial8

    您需要指定器件引导表的版本。 v5505适用于 C5505、C5515、C5535、C5545和 C5517。

    要了解有关“hex55.exe”的更多信息,请参阅 第13节中的《TMS320C55x 汇编语言工具用户指南》(www-s.ti.com/.../spru280)。

    如果您的二进制程序仍然无法与引导加载程序一起运行、则需要确认该程序执行所有初始化步骤。 最好的检查方法是在 CCS 中连接到目标、而不使用 GEL 文件。 GEL 文件为您执行初始化、但引导加载程序不执行此初始化。 因此、您需要在应用程序中执行此操作:初始化 PLL、使所有端口空闲、取消门外设时钟、并在配置外设之前复位外设。

    AT24C512C I2C EEPROM 具有2个或3个地址引脚、用于定义其 I2C 地址。 编程器假定地址为0x50。 这意味着所有2或3个地址引脚都短接至 GND。 如果地址是其他地址、则应在中修改#define IIC_EEPROM_SLAVE_ADDR 0x50后重新编译程序员 \C55_CSL\ccs_v6.x_examples\programmer\include\iic_eeprom.h

    希望这对您有所帮助、
    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mark。

    我有一些问题。

    请帮帮我。

    实际上我在 I2C EEPROM 中进行了编程。

    但它的工作不是很好。

    当我在 RAM 中进行编程时、它运行良好。

    但在 I2C EEPROM 中、它不能使用 DMA。 我不确定 I2S 是否也能正常工作。

    我认为这是您在上面提到的初始化问题。

    我阅读了一些数据表、并对 PLL 以及端口和复位外设进行了初始化。

    这是我的代码。 请与我联系

    ------------------------------------------------------------------

    #include "cSL_dma.h"

    #include "CSL_I2S.h"

    #include

    #include

    #include "cSL_sysctrl.h"

    #include "cSL_intc.h"

    #include "DAC_PCM5142.h"

    #include "CSL_PLL.h"

    #include "cSL_general.h"

    #include "CSL_pllAux.h"

    #define CSL_TEST_FAILED      (1)

    #define CSL_TEST_PASSED      (0)

    #define CSL_DMA0_CH0       (0)

    #define CSL_I2S_DMA_BUF_LEN (88)

    #define DMA_DATA_LENGTH      CSL_I2S_DMA_BUF_LEN*4;

    CSL_DMA_ChannelObj dmaObj0、dmaObj1、dmaObj2、dmaObj3;

    CSL_DMA_Handle dmaLeftTxHandle;

    CSL_DMA_Handle dmaRightTxHandle;

    CSL_DMA_Handle dmaLeftRxHandle;

    CSL_DMA_Handle dmaRightRxHandle;

    CSL_DMA_Config dmaConfig;

    CSL_I2sHandle  hI2、hI2s_2;

    CSL_IRQ_Dispatch   调度表;

    PLL_Obj pllObj;

    PLL_Config pllCfg1;

    pll_handle hPll;

    PLL_Config * pConfigInfo;

    PLL_Config pllCfg_12p288MHz ={0x8173、0x8000、0x0806、0x0000};

    PLL_Config pllCfg_40MHz   ={0x8988、0x8000、0x0806、0x0201};

    PLL_Config pllCfg_60MHz   ={0x8724、0x8000、0x0806、0x0000};

    PLL_Config pllCfg_75MHz   ={0x88ED、0x8000、0x0806、0x0000};

    PLL_Config pllCfg_100MHz  ={0x8BE8、0x8000、0x0806、0x0000};

    PLL_Config pllCfg_120MHz  ={0x8E4A、0x8000、0x0806、0x0000};

    易失性 UINT16 dmaTxFrameCount = 0、dmaRxFrameCount=0、dmaIntCount、toggle;

    #pragma DATA_ALIGN (i2sDmaWriteLeftBuff、32);

    uint32 i2sDmaWriteLeftBuff[CSL_I2S_DMA_BUF_LEN];

    #pragma DATA_ALIGN (i2sDmaWriteRightBuff、32);

    uint32 i2sDmaWriteRightBuff[CSL_I2S_DMA_BUF_LEN];

    #pragma DATA_ALIGN (i2sDmaReadLeftBuff、32);

    uint32 i2sDmaReadLeftBuff[CSL_I2S_DMA_BUF_LEN];

    #pragma DATA_ALIGN (i2sDmaReadRightBuff、32);

    uint32 i2sDmaReadRightBuff[CSL_I2S_DMA_BUF_LEN];

    中断空 DmaIsr (空);

    空用户算法(空);

    void PLL_sample ()

      CSL_Status 状态;

      PLL_init (&pllObj、CSL_PLL_INST_0);

      hPll =(PLL_Handle)(&pllObj);

      PLL_RESET (hPll);

      /*将 PLL 配置为100MHz */

      pConfigInfo =&pllCfg_100MHz;

     PLL_CONFIG (hPll、pConfigInfo);

    //PLL 配置完成

    //以下代码用于演示其他 CSL PLL API

      PLL_getconfig (hPll、&pllCfg1);//演示 PLL 配置

      PLL_BYPASS (hPll);//演示 PLL 旁路和断电

      PLL_ENABLE (hPll);//演示 PLL 使用之前的配置加电和启用

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    空 I2S_SET (空)

    I2S_Config hwconfig;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  I2S_0

    hI2 = I2S_open (I2S_INSTANCE0、DMA_polled、I2S_CHAN_STEREO);

    SYS_setEBSR (CSL_EBSR_FIELD_SP0MODE、CSL_EBSR_SP0MODE_1); // i2s0端口被置位

    /**设置配置结构的值*/

    hwconfig.datatype = I2S_立体声_enable;       // 0立体声 单声道

    //hwconfig.loopBackMode = I2S_loopback_enable;      // 1启用0禁用

    hwconfig.loopBackMode    = I2S_loopback_disable;      // 1启用0禁用

    hwconfig.fsPol = I2S_FSPOL_LOW;         // ws low =左通道

    hwconfig.clkPol = I2S_FALLING_EDGE;        //在下降沿对接收数据进行采样,并将发送数据移入

                                  //位时钟的上升沿。

    hwconfig.datadelay = I2S_DATADELAY_ONEBIT;     //0 -> 1位延迟1->2位延迟

    hwconfig.datapack = I2S_DATAPACK_DISABLE;     //

    hwconfig.signext = I2S_SIGNEXT_DISABLE;     //单词扩展

    hwconfig.wordLen = I2S_WORDLEN_16;        // 0-8、1-10、2-12、3-14、4-16、 5-18、6-20、7-22、8-24

    //hwconfig.i2sMode = I2S_MASTER;          // 0个从设备,1个主设备

    hwconfig.i2sMode       = I2S_SLAVE;          // 0个从设备,1个主设备

    hwconfig.FError = I2S_FSERROR_DISABLE;

    hwconfig.OutError = I2S_OUERROR_DISABLE;

    I2S_setup (hI2、hwconfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  I2S_2

    hI2s_2 = I2S_open (I2S_instance2、dma_polled、I2S_CHAN_STEREO);

      SYS_setEBSR (CSL_EBSR_FIELD_PPMODE、CSL_EBSR_PPMODE_6);  // i2s2模式设置

      /**设置配置结构的值         *

      hwconfig.datatype       = I2S_立体声_ENABLE;       // 0立体声 单声道

      //hwconfig.loopBackMode      = I2S_LOOP_ENABLE;      // 1启用0禁用

      hwconfig.loopBackMode    = I2S_loopback_disable;      // 1启用0禁用

      hwconfig.fsPol        = I2S_FSPOL_LOW;         //

      hwconfig.clkPol        = I2S_FALLING_EDGE;        //在下降沿对接收数据进行采样,并将发送数据移入

                                    //位时钟的上升沿。

      hwconfig.datadalay      = I2S_DATADELAY_ONEBIT;     //0 -> 1位延迟1->2位延迟

      hwconfig.datapack       = I2S_DATAPACK_DISABLE;     //

      hwconfig.signext       = I2S_SIGNEXT_DISABLE;     //单词扩展

      hwconfig.wordLen       = I2S_WORDLEN_16;        // 0-8、1-10、2-12、3-14、4-16、 5-18、6-20、7-22、8-24

    //  hwconfig.i2sMode       = I2S_MASTER;          // 0个从设备,1个主设备

      hwconfig.i2sMode       = I2S_SLAVE;          // 0个从设备,1个主设备

      //hwconfig.clkDiv        = I2S_CLKDIV8;         //I2Sn_CLK =系统时钟/(2CLKDIV+1)

      //hwconfig.fsDiv        = I2S_FSDIV256;         //I2Sn_FS = I2Sn_CLK /(2FSDIV+3)

      hwconfig.FError        = I2S_FSERROR_DISABLE;

      hwconfig.OuError       = I2S_OUERROR_DISABLE;

      I2S_setup (hI2s_2、hwconfig);

    void dma_set (void)

      内部16.       状态= CSL_TEST_FAILED、ifrValue;

      IRQ_DISABLE (DMA_EVENT);

      IRQ_CLEAR (DMA_EVENT);

      CSL_SYSCTRL_REGS->DMAIER = 0x0000;

      ifrValue = CSL_sysctrl_regs->DMAIFR;

      cSL_sysctrl_regs->DMAIFR |= ifrValue;

      IRQ_plug (DMA_EVENT、&DmaIsr);// DMA 中断置1

    dma_init(); //dma 时钟启用

      IRQ_ENABLE (DMA_EVENT);// DMA 中断使能

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// I2S0_RX_LEFT 通道 DMA 通道1

    dmaConfig.pingPongMode = CSL_DMA_PING_PON_ENABLE;

    dmaConfig.autoMode   = CSL_DMA_AUTORELOAD_ENABLE;

    dmaConfig.burstLen   = CSL_DMA_TXBUST_1WORD;

    dmaConfig.trigger   = CSL_DMA_EVENT_TRIGGER;

    dmaConfig.dmaEvt    = CSL_DMA_EVT_I2S0_RX;

    dmaConfig.dmaInt    = CSL_DMA_INTERRUPT_ENABLE;

    dmaConfig.chanDir   = CSL_DMA_READ;

    dmaConfig.trfType   = CSL_DMA_TRANSIT_IO_MEMORY;

    dmaConfig.dataLen   = dma_data_length;

    dmaConfig.srcAddr   =(uint32)&CSL_I2S0_regs->I2SRXLT0;// I2S0_I2SRXLT0

    dmaConfig.destAddr   =(uint32) i2sDmaReadLeftBuff;

    dmaLeftRxHandle = DMA_open (CSL_DMA_CHAN1、&dmaObj0、STATUS);

      dma_config (dmaLeftRxHandle、&dmaConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// I2S0_RX_RIGHT 通道 DMA CH2

    dmaConfig.pingPongMode = CSL_DMA_PING_PON_ENABLE;

    dmaConfig.autoMode   = CSL_DMA_AUTORELOAD_ENABLE;

    dmaConfig.burstLen   = CSL_DMA_TXBUST_1WORD;

    dmaConfig.trigger   = CSL_DMA_EVENT_TRIGGER;

    dmaConfig.dmaEvt    = CSL_DMA_EVT_I2S0_RX;

    dmaConfig.dmaInt    = CSL_DMA_INTERRUPT_ENABLE;

    dmaConfig.chanDir   = CSL_DMA_READ;

    dmaConfig.trfType   = CSL_DMA_TRANSIT_IO_MEMORY;

    dmaConfig.dataLen   = dma_data_length;

    dmaConfig.srcAddr   =(uint32)&CSL_I2S0_regs->I2SRXRT0;//I2S0_I2SRXRT0

    dmaConfig.destAddr   =(uint32) i2sDmaReadRightBuff;

    dmaRightRxHandle = DMA_open (CSL_DMA_CHAN2、&dmaObj1、STATUS);

      dma_config (dmaRightRxHandle、&dmaConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// I2S2_TX_LEFT 通道 DMA 通道 CH4

      dmaConfig.pingPongMode = CSL_DMA_PING_PON_ENABLE;

      dmaConfig.autoMode   = CSL_DMA_AUTORELOAD_ENABLE;

      dmaConfig.burstLen   = CSL_DMA_TXBUST_1WORD;

      dmaConfig.trigger   = CSL_DMA_EVENT_TRIGGER;

      dmaConfig.dmaEvt    = CSL_DMA_EVT_I2S2_TX;

      dmaConfig.dmaInt    = CSL_DMA_INTERRUPT_ENABLE;

      dmaConfig.chanDir   = CSL_DMA_WRITE;

      dmaConfig.trfType   = CSL_DMA_TRANSIT_IO_MEMORY;

      dmaConfig.dataLen   = dma_data_length;

      dmaConfig.srcAddr   =(uint32) i2sDmaWriteLeftBuff;

    //  dmaConfig.srcAddr   =(uint32) i2sDmaReadLeftBuff;

      dmaConfig.destAddr   =(UINT32)(0x2A08);

      dmaLeftTxHandle = DMA_open (CSL_DMA_CHAN4、&dmaObj2、STATUS);

      dma_config (dmaLeftTxHandle、&dmaConfig);

      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// I2S2_TX_RIGHT 通道 DMA ch5

      dmaConfig.pingPongMode = CSL_DMA_PING_PON_ENABLE;

      dmaConfig.autoMode   = CSL_DMA_AUTORELOAD_ENABLE;

      dmaConfig.burstLen   = CSL_DMA_TXBUST_1WORD;

      dmaConfig.trigger   = CSL_DMA_EVENT_TRIGGER;

      dmaConfig.dmaEvt    = CSL_DMA_EVT_I2S2_TX;

      dmaConfig.dmaInt    = CSL_DMA_INTERRUPT_ENABLE;

      dmaConfig.chanDir   = CSL_DMA_WRITE;

      dmaConfig.trfType   = CSL_DMA_TRANSIT_IO_MEMORY;

      dmaConfig.dataLen   = dma_data_length;

      dmaConfig.srcAddr   =(uint32) i2sDmaWriteRightBuff;

    //  dmaConfig.srcAddr   =(uint32) i2sDmaReadRightBuff;

      dmaConfig.destAddr   =(uint32)(0x2A0C);

      dmaRightTxHandle = DMA_open (CSL_DMA_CHAN5、&dmaObj3、STATUS);

      dma_config (dmaRightTxHandle、&dmaConfig);

    中断空 DmaIsr (空)

      易失性 uint16 ifrValue;

      ifrValue = CSL_sysctrl_regs->DMAIFR;

      cSL_sysctrl_regs->DMAIFR |= ifrValue;

      IF (ifrValue & 4)          // DMA 通道4,5发送

      {

        dmaTxFrameCount++;

      }

      IF (ifrValue & 5)

      {

        dmaTxFrameCount++;

      }

      IF (ifrValue & 1)         // DMA 通道1、2 Rx

      {

        dmaRxFrameCount++;

      }

      IF (ifrValue & 2)

      {

        dmaRxFrameCount++;

      }

      dmaIntCount++;

    空 waitloop (无符号长循环)

      //volatile unsigned short 计数器= loopval;

      volatile unsigned long 计数器= loopval;

      while (计数器)

      {

        计数器-;

      }

    void main (void)

    Int16  环流器;

    uint32 check_buff = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 初始化

    waitloop (0xfffffff);//150ms 延迟

      ///----------------

      // PLL 初始化

      asm ("  *端口(#0x1C1F)=#0x0 ");//时钟配置 MSW 寄存器

      // 在 CLK_SEL = 0时将 PLL 编程为100MHz

      asm ("  *端口(#0x1c20)=#0x8BE8 ");//PLL 控制1寄存器

      asm ("  *端口(#0x1c21)=#0x8000 ");//PLL 控制2寄存器

      asm ("  *端口(#0x1c22)=#0x0806 ");//PLL Control 3 reg

      asm ("  *端口(#0x1C23)=#0x0000 ");//PLL 控制4寄存器

      //等待至少4毫秒以锁定 PLL

      asm ("  repeat (0xC350) ");

      asm ("     NOP"   );

      asm ("  *端口(#0x1c1F)=#0x0001 ");//时钟配置 MSW 寄存器

      ///----------------

      // PLL 初始化

      *(volatile ioport UINT16 *) 0x0001 = 0x020E;

      asm ("  idle");

      //重置所有外设

      CSL_SYSCTRL_REGS->PSRCR = 0x0020;

      CSL_SYSCTRL_REGS->PRCR = 0x00BF;

      waitloop (0xfffffff);//150ms 延迟

      ///----------------

      //所有 GPIO 输入置1

      CSL_GPIO_regs->IODIR1 = 0xFFFF;

      CSL_GPIO_regs->IODIR2 = 0xFFFF;

      ///----------------------

      // IRQ 初始化

      IRQ_globalDisable();

      IRQ_disableAll();

      IRQ_CLEARALL();

      ///----------------------

      // DAC XSMIT 高设置

      CSL_GPIO_regs->IODIR2 = 0x0001; //GPIO 16输出设置(DAC XSMT)

      CSL_GPIO_regs->IOOUTSTATA2=0x0000;// 1输出

      for (looper=0;looper < CSL_I2S_DMA_BUF_LEN;looper++)

      {

        i2sDmaWriteLeftBuff[looper]=0;

        i2sDmaReadLeftBuff[环] = 0;

        i2sDmaWriteRightBuff[looper]=0;

        i2sDmaReadRightBuff[looper]=0 ;

      }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

      PCM5142_init ();// DAC 设置(i2c)

    I2S_SET ();//I2S 置位

    dma_set();// dma set

      IRQ_globalEnable();

    I2S_transEnable (hI2、TRUE);// I2S_0启动

      I2S_transEnable (hI2s_2、true);// I2S_2启动

      while (1)

      {

        UserAlgorith();//receive 和 transmit

      }

    空用户算法(空)

      int i;

      if (!dmaRxFrameCount)

      {

        /* Start Left Rx DMA */

        DMA_START (dmaLeftRxHandle);

        /*启动右 RX DMA */

        DMA_START (dmaRightRxHandle);

      }

      IF (dmaRxFrameCount >= 2)

      {

        dmaRxFrameCount=0;

        (i=0;<CSL_I2S_DMA_BUF_LEN; i++)

        {

          i2sDmaWriteLeftBuff[i] = i2sDmaReadLeftBuff[i];

          i2sDmaWriteRightBuff[i]= i2sDmaReadRightBuff[i];

        }

        /*--在此处插入算法--*/

      }

      if (!dmaTxFrameCount)

      {

        /*开始左 Tx DMA */

        DMA_START (dmaLeftTxHandle);

        /*右启动 Tx DMA */

        DMA_START (dmaRightTxHandle);

      }

      /*清除 DMA 帧计数*/

      if (dmaTxFrameCount>=2)

      {

        dmaTxFrameCount = 0;

      }

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、当我检查 DMA 中断功能是否正常工作时、它现在可以工作。

    但是、当我在 RAM 中进行编程时、它运行良好。

    请检查一下。

    谢谢