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:
一样的,我不小心传了两次,一次测试,我以为没传上