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/MSP430FR5738:具有 DMA 的 I2C 从设备

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/846008/ccs-msp430fr5738-i2c-slave-with-dma

器件型号:MSP430FR5738

工具/软件:Code Composer Studio

尊敬的团队:

我的客户正在使用 具有 DMA 模式的 MSP430FR5738 I2C。 他在调试 FR5738时遇到问题、这似乎是430微控制器中的一个错误。

1. P1.6/1.7配置为 I2C 从机通信模式,I2C 从机 RX 和从机 TX 配置为 DMA 模式。 配置代码如下:


 由于 I2C 接受数据、因此接收长度不是提前知道的。 因此、当接收到 DMA 时、它表示一帧数据的末尾

当 STOP 信号到达时、当 STOP 信号到达时、当前 DMA 传输结束。

 I2C 配置

空 I2C_Slave_Init (无符号字符地址)

UCB0CTLW0 |= UCSWRST;//复位 I2C 模块

UCB0CTLW0 |= UCMODE_3 + UCSYNC;//I2C 从器件

UCB0CTLW1 &=~USCI_I2C_UCCLTOIFG;

UCB0CTLW1 |=(0x01 <<6);

UCB0I2COA0 =地址+ UCOAEN;//I2C 地址

 

//set P1.6 & P1.7 on I2C mode

P1SEL1 |= BIT6 + BIT7;

P1SEL0 &=~BIT6;

P1SEL0 &=~BIT7;

 

UCB0CTLW0 &=~UCSWRST;//释放复位 I2C 模块

UCB0IE_I2C |= UCSTPIE;//启用 I2C 中断

 

I2C 从机 RX DMA 配置

 

空 I2C_Slave_RX_DMA_Config ()

 

 

DMA0CTL =

 

(0x00 << 12)//单次传输

|(0x03 << 10)//Dest Inc

|(0x00 << 8)//src 不变

|(0x01 << 7)

|(0x01 << 6);

 

 

DMA0SA =(无符号整型)&UCB0RXBUF;

DMA0DA =(无符号 int) buf;

DMA0SZ = 40;

DMACTL0 |= 18;//MSP430FR5738 I2C 从器件 RX 触发器

 

DMA0CTL |= DMAIE;

DMA0CTL |= DMAEN;

 

switch (__evo_in_range (UCB0IV、0x1E))

 

情况0x08:

if (UCB0CTLW0_bit.UCTR = 0)//接收

 

    DMA I2C 从机 RX 重新配置

 

else //发送器

    DMA I2C 从器件 TX 重新配置

UCB0IFG = 0;

中断;

 

默认值:

中断;

MAIN ()

 

 

  …

 

  I2C_Slave_Init();

 

  I2C_Slave_RX_DMA_Config ();

 

_EINT();

 

while (1)

 

(笑声)

 

 

//P2DIR_BIT.P2DIR2 = 1;μ A

 

 

 


A)如果 while (1)循环中涉及 IO 寄存器的配置、则 I2C 从机 RX DMA 接收会有问题。

 
目前检测到两种情况。 一个是停止信号未被识别、并且不会产生中断。 另一个是已生成中断 IFG 标志、但没有中断服务例程。 如果它在仿真器中暂停一次、然后以全速运行、则中断服务例程

 

b)如果在 while (1)中 IO 端口上没有操作、则整个 I2C 从机 RX DMA 没有问题。

请帮助。

BR、

Susan

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

    你(们)好 Susan

    我看到这个问题来自中国 E2E、我将在那里作出回应。 感谢你的帮助。

    此致

    Gary

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

    感谢您的支持!

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

    此问题由 DMA7导致。  

     while (1)循环中的代码 P2DIR_BIT.P2DIR2 = 1将编译为 BIS.B 指令、该指令为读-修改-写指令。 当 CPU 操作这些指令并且一个 DMA 请求出现时、CPU 可能会错过下一个中断。

    解决方法:避免使用 读-修改-写指令。 对于 P2DIR_BIT.P2DIR2 = 1、可由 buffer=P2OUT; P2OUT=buffer|BIT0;(缓冲区是预定义的无符号字符变量)替代