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.

[参考译文] TMS320F28335:McBSP-B 问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/699219/tms320f28335-problem-with-mcbsp-b

器件型号:TMS320F28335
主题中讨论的其他器件:C2000WAREADS7809

您好!

我使用的是 McBSP-B 的16位 ADC 输入、GPIO25上的接收串行数据 MDRB、GPIO60上的接收时钟 MCLKRB 和 GPIO61上的接收帧同步 MFSRB。

我的问题是 接收器就绪位 RRDY 未置位、数据输入未加载到数据接收寄存器 DRR1中。

如果在运行时使用仿真器切换发送帧同步极性位 FSRP、我会在 DRR1中获得良好的数据、就像接收帧同步信号 MFSRB 没有开始传输一样。

示波器 CH1为 MFSRB、CH2为 MCLKRB、CH3为 MDRB。  当我使用仿真器读取 GPIO 输入时、所有信号都是正确的。

空 InitMcbspb (空)

// McBSP-B 寄存器设置

McbspbRegs.SPCR2.all=0x0000;//重置 FS 发生器、采样率发生器和发送器
McbspbRegs.SPCR1.All=0x0000;//复位接收器、右对齐字
// McbspbRegs.SPCR1.bit.DLB = 1;//为测试启用回送模式。 为正常 McBSP 传输模式注释。

McbspbRegs.MFFINT.All=0x0;//禁用所有中断

McbspbRegs.RCR2.all=0x0;//单相帧、1字/帧、无压扩(接收)
McbspbRegs.RCR1.All=0x0;

McbspbRegs.XCR2.all=0x0;//单相帧、1字/帧、无压扩(发送)
McbspbRegs.XCR1.All=0x0;

McbspbRegs.pcr.bit.FSXM = 1;// FSX 在内部生成、FSR 源自外部源

McbspbRegs.SRGR2.bit.CLKSM = 1;// CLKSM=1 (如果 SCLKME=0、SRG 的 I/p 时钟为 LSPCLK)
McbspbRegs.SRGR2.bit.FPER = 31;// FPER = 32 CLKG 周期

McbspbRegs.SRGR1.bit.FWID = 0;//帧宽度= 1 CLKG 周期
McbspbRegs.SRGR1.bit.CLKGDV = CLKGDV_VAL;// CLKG 频率= LSPCLK/(CLKGDV+1)

delay_loop ();//等待至少2个 SRG 时钟周期

InitMcbspb16bit();// 16位字

McbspbRegs.pcr.bit.FSRP = 1;//帧同步脉冲 FSR 为低电平有效。
McbspbRegs.pcr.bit.CLKRP = 1;//接收数据在 MCLKR 的上升沿被采样

McbspbRegs.pcr.bit.CLKXM = 1;// CLKX 在内部生成、CLKR 取自一个外部源
delay_loop ();//等待至少2个 SRG 时钟周期
McbspbRegs.SPCR2.bit.GRST=1;//启用采样率发生器
clkg_delay_loop ();//等待至少2个 CLKG 周期
McbspbRegs.SPCR2.bit.XRST=1;//从复位中释放 TX
McbspbRegs.SPCR1.bit.RRST=1;//从复位中释放 RX
McbspbRegs.SPCR2.bit.frst=1;//帧同步发生器复位

空 InitMcbspa16位(空)

McbspaRegs.RCR1.bit.RWDLEN1=2;// 16位字
McbspaRegs.XCR1.bit.XWDLEN1=2;// 16位字

空 InitMcbspbGpio (空)

EALLOW;
/*使用 GPIO 寄存器配置 McBSP-A 引脚*/
//这指定哪些可能的 GPIO 引脚将是 McBSP 功能引脚。
//注释掉其他不需要的行。

//GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 3;// GPIO12是 MDXB 引脚(根据需要注释)
// GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3;// GPIO24是 MDXB 引脚(根据需要注释)
//GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 3;// GPIO13是 MDRB 引脚(根据需要注释)
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3;// GPIO25是 MDRB 引脚(根据需要注释)
//GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 3;// GPIO14是 MCLKXB 引脚(根据需要注释)
// GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 3;// GPIO26是 MCLKXB 引脚(根据需要注释)
// GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 3;// GPIO3是 MCLKRB 引脚(根据需要注释)
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 1;// GPIO60是 MCLKRB 引脚(根据需要注释)
//GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 3;// GPIO15是 MFDXB 引脚(根据需要注释)
// GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 3;// GPIO27是 MFSXB 引脚(根据需要注释)
// GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 3;// GPIO1是 MFSRB 引脚(根据需要注释)
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 1;// GPIO61是 MFSRB 引脚(根据需要注释)

/*为所选引脚启用内部上拉*/
//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。
//注释掉其他不需要的行。
// GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0;//启用 GPIO24上的上拉(MDXB)(根据需要注释)
//GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;//启用 GPIO12上的上拉电阻(MDXB)(根据需要注释)
//GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0;//启用 GPIO25 (MDRB)上的上拉电阻(根据需要注释)
//GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0;//启用 GPIO13上的上拉电阻(MDRB)(根据需要注释)
//GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0;//启用 GPIO26上的上拉电阻(MCLKXB)(根据需要注释)
//GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0;//启用 GPIO14上的上拉电阻(MCLKXB)(根据需要注释)
// GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;//启用 GPIO3上的上拉电阻(MCLKRB)(根据需要注释)
//GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;//启用 GPIO60上的上拉电阻(MCLKRB)(根据需要注释)
// GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0;//启用 GPIO27上的上拉电阻(MFSGB)(根据需要注释)
//GpioCtrlRegs.GPAPUD.bit.GPIO15 = 0;//启用 GPIO15上的上拉电阻(MFSGB)(根据需要注释)
// GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;//启用 GPIO1 (MFSRB)上的上拉电阻(根据需要注释)
//GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;//启用 GPIO61 (MFSRB)上的上拉电阻(根据需要注释)


/*将所选输入引脚的限定条件设置为仅异步*/
//这将为所选引脚选择异步(无限定条件)。
//注释掉其他不需要的行。
GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3;//异步输入 GPIO25 (MDRB)(需要注释)
//GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 3;//异步输入 GPIO13 (MDRB)(需要注释)
// GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3;//异步输入 GPIO26 (MCLKXB)(需要注释)
//GpioCtrlRegs.GPAQSEL1.bit.GPIO14 = 3;//异步输入 GPIO14 (MCLKXB)(需要注释)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 3;//异步输入 GPIO3 (MCLKRB)(需要注释)
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;//异步输入 GPIO60 (MCLKRB)(需要注释)
// GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3;//异步输入 GPIO27 (MFSXB)(需要注释)
//GpioCtrlRegs.GPAQSEL1.bit.GPIO15 = 3;//异步输入 GPIO15 (MFSXB)(需要注释)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 3;//异步输入 GPIO1 (MFSRB)(需要注释)
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3;//异步输入 GPIO61 (MFSRB)(需要注释)


EDIS;

空 InitXintf32Gpio()

EALLOW;
GpioCtrlRegs.GPBMUX2.bit.GPIO48=3;// XD31
GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 3;// XD30
GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 3;// XD29
GpioCtrlRegs.GPBMUX2.bit.GPIO51 = 3;// XD28
GpioCtrlRegs.GPBMUX2.bit.GPIO52=3;// XD27
GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 3;// XD26
GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 3;// XD25
GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 3;// XD24
GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 3;// XD23
GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 3;// XD22
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;// XD21
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;// XD20
// GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;// XD19
// GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3;// XD18
GpioCtrlRegs.GPBMUX2.bit.GPIO62=3;// XD17
GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 3;// XD16

GpioCtrlRegs.GPBQSEL2.bit.GPIO48 = 3;// XD31异步输入
GpioCtrlRegs.GPBQSEL2.bit.GPIO49 = 3;// XD30异步输入
GpioCtrlRegs.GPBQSEL2.bit.GPIO50 = 3;// XD29异步输入
GpioCtrlRegs.GPBQSEL2.bit.GPIO51 = 3;// XD28异步输入
GpioCtrlRegs.GPBQSEL2.bit.GPIO52 = 3;// XD27异步输入
GpioCtrlRegs.GPBQSEL2.bit.GPIO53 = 3;// XD26异步输入
GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3;// XD25异步输入
GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3;// XD24异步输入
GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3;// XD23异步输入
GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3;// XD22异步输入
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;// XD21异步输入
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;// XD20异步输入
// GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;// XD19异步输入
// GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3;// XD18异步输入
GpioCtrlRegs.GPBQSEL2.bit.GPIO62=3;// XD17异步输入
GpioCtrlRegs.GPBQSEL2.bit.GPIO63 = 3;// XD16异步输入

InitXintf16Gpio();

 感谢您的帮助、

Curtis Randall

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

    一些意见。
    首先、内部管理:如果您计划将来再次发布代码、请使用 RTF 编辑器中的代码上下文导入。 这有助于使线程更具可读性、因为 C 语法已正确突出显示。

    内容。 请回答这些问题、以便我更好地帮助:
    1.您要与哪些外部 ADC 通信? 您似乎打算使用 McBSP 的 ClockStop 模式(SPI 模式)、这是正确的吗? 如果是、您的配置和硬件设置不正确。 请参阅用户指南的使用时钟停止模式进行 SPI 操作部分以及 c2000Ware 中的 McBSP SPI 模式示例。
    2.是否要启用数字回送位?
    3.切换 FSRP 在任何工作模式下都不是有效的用例。 这是一个配置/控制位、在 McBSP 接收器超出复位范围(RRST = 1)时对其进行修改会导致未定义的行为。 我知道您是作为调试步骤执行此操作的、但通常不建议这么做。

    我希望这能让您入门。

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

    Mark、您好!

    我将在将来使用富文本。

    外部 ADC 是 ADS7809或等效器件、我们有多个源。 是、我打算使用 SPI 模式。 我复制了然后修改了 Example_2833xMcBSP_DLB.c. 接下来、我将查看 Example_2833xMcBSP_SPI_DLB.c

    2.我不打算启用数字回送位、这是问题吗?

    我理解不建议切换 FSRP、只是注意到它读取了数据。

    谢谢、

    Curtis Randall

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

    Mark、您好!

    将 MCLKXB 和 MFSGB 用作输入、并在 McBSP SPI 从器件工作时进行重新编程。

    谢谢、

    Curtis Randall