TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430FR5738 I2C slave mode DMA 问题

MSP430FR5738 I2C DMA 模式调试时碰到了一个问题,貌似是430单片机的bug,问题描述如下

1、P1.6/1.7配置成I2C Slave 通信模式,I2C Slave RX 和Slave TX配置成DMA模式,配置代码如下

      由于I2C 接受数据时,事先并不知道接收长度,在DMA接收时,当STOP信号到来时,表示一帧数据的结束。

      当STOP信号到来时,结束当前DMA传输

      1. I2C Config

void I2C_Slave_Init(unsigned char address)
{
UCB0CTLW0 |= UCSWRST; //reset I2C Module
UCB0CTLW0 |= UCMODE_3 + UCSYNC; //I2C Slave
UCB0CTLW1 &= ~USCI_I2C_UCCLTOIFG;
UCB0CTLW1 |= (0x01 << 6);
UCB0I2COA0 = address + UCOAEN; //I2C ADDRESS

//Set P1.6 & P1.7 on I2C MODE
P1SEL1 |= BIT6 + BIT7;
P1SEL0 &= ~BIT6;
P1SEL0 &= ~BIT7;
UCB0CTLW0 &= ~UCSWRST; //release reset I2C Module
UCB0IE__I2C |= UCSTPIE;//Enable I2C INTERRUPT

}

2、I2C Slave RX DMA config

void I2C_Slave_RX_DMA_Config()

{

DMA0CTL = 

(0x00 << 12) //Single Transfer
|(0x03 << 10) //Dest Inc
|(0x00 << 8) //Src Unchange
|(0x01 << 7)
|(0x01 << 6);

DMA0SA = (unsigned int)&UCB0RXBUF;
DMA0DA = (unsigned int)buf;
DMA0SZ = 40;
DMACTL0 |= 18;//MSP430FR5738 I2C Slave RX Trigger
DMA0CTL |= DMAIE;
DMA0CTL |= DMAEN;

}

3、中断

switch(__even_in_range(UCB0IV,0x1E))
{

case 0x08: if(UCB0CTLW0_bit.UCTR == 0) //Receive
{

      DMA I2C Slave RX ReConfig

}
else //Transmitter
{
     DMA I2C Slave TX ReConfig
}
UCB0IFG = 0;
break;

default:
break;
}

main()

{

   …..

   I2C_Slave_Init();

   I2C_Slave_RX_DMA_Config();

  _EINT();

  while(1)

{

….

//P2DIR_bit.P2DIR2 = 1;

}

}

问题

如果在while(1)的循环里涉及到单片机IO寄存器的配置,操作,则 I2C Slave RX DMA接收就会出问题,表现目前监测到两种情况,一种就是没有识别STOP信号,无中断产生,另一种是中断IFG标志已产生,但没有进中断服务程序,如果此时在仿真器中暂停一次,再全速运行,则可以进中断服务程序

如果while(1)里没有对IO端口的操作,则整个I2C Slave RX DMA 没有任何问题

对IO端口寄存器配置操作,不会影响I2C Slave TX DMA

Susan Yang:

请您先看一下 www.ti.com/…/slaz391ae.pdf的 DMA9

我手边没有这个型号的板子,我会找同系列的来测试一下,请您等待,谢谢

仙狂:

回复 Susan Yang:

用TI自己的MSP430FR5739的试验板测试就可以

Susan Yang:

回复 仙狂:

嗯 但是我手边没有这个板子,只有5969的

Gary Gao:

你好 首先有一些代码上的建议 1. 清除USCI_I2C_UCCLTOIFG 标志位应该是在UCB0IFG 寄存器中 2. UCB0CTLW1 |= (0x01 << 6); 你是打算使能 Clock low timeout 对吧? 3. 对于DMA 源地址和目的地址的配置请参照我们的参考历程dev.ti.com/…/node 为了我们能更快的定位问题, 可以提供一个完整的CCS 或IAR 的可以复现问题的最简工程吗? 最好附上Host 端的代码如果Host 也是MSP430

仙狂:

回复 Gary Gao:

1. 清除USCI_I2C_UCCLTOIFG 标志位应该是在UCB0IFG 寄存器中
2. UCB0CTLW1 |= (0x01 << 6); 你是打算使能 Clock low timeout 对吧?
—–1.2两个问题,这个功能可以去掉的,就是因为我发现这个问题本身后,启用这个功能看能不能自恢复的,这个功能的开和关不影响这个问题的复现。
3. 对于DMA 源地址和目的地址的配置请参照我们的参考历程dev.ti.com/…/node
—-这个我会去看一下
4、完整的功能,和HOST端问题
—-完整的IAR工程可以的,怎么提供呢?I2C的Host端,我们为了调试方便,是采购了一批USB转I2C的模块的,型号是Ginkgo的USB转I2C,我们自己写的Host端,不灵活,所以调试I2C功能的时候,我们直接使用的这种模块

Gary Gao:

回复 仙狂:

你好

代码上传可以在这里使用高级编辑器编辑文本 如下图里面就可以上传附件

仙狂:

回复 仙狂:

msp430fr57xx_iap.zip

仙狂:

回复 Gary Gao:

0841.msp430fr57xx_iap.zip

Gary Gao:

回复 仙狂:

为什么有两个工程,有什么区别吗?

仙狂:

回复 Gary Gao:

一样的,我不小心传了两次,一次测试,我以为没传上

赞(0)
未经允许不得转载:TI中文支持网 » MSP430FR5738 I2C slave mode DMA 问题
分享到: 更多 (0)