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.
工具/软件: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;(缓冲区是预定义的无符号字符变量)替代