Forums

MSP430F5338 I2C通讯

开始于 歌颂歌 2012年8月28日
大家好,

我必须通过I2C从从传感器(LSM303DLM:Accelerometer)接收数据。 但是我不太清楚如何制作转码& receive.

这是我的I2C寄存器设置代码。但我不知道下一步该怎么做 此代码。我只想传输从机地址,寄存器地址和数据。 然后连续从从传感器接收数据。有很多例子 在线代码,但我听不懂...请让我知道示例 代码或一些重定向。谢谢。
无效SetI2C(无效)
{
UCB0CTL1|= UCSWRST; // **Put state machine in reset**
UCB0CTL0 | = UCMST | UCSYNC | UCMODE_3;
//主模式,7位地址,I2C模式

UCB0CTL1|= UCSSEL_2; // SMCLK
UCB0BR0 = 0x04; // / 4-2.304 MHz
UCB0BR1 = 0;
UCB0I2CSA = ACC_ADDRESS_W;
UCB0CTL1&=〜UCSWRST; // **初始化USCI状态机**
UCB0IE = UCNACKIE;
}

MSP430入门微控制器

#包括

unsigned int RxByteCtr;
unsigned int RxWord;

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //停止WDT
P1DIR | = 0x01; // P1.0输出
P3SEL | = 0x06; //将I2C引脚分配给
USCI_B0
UCB0CTL1 | = UCSWRST; //启用软件重置
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C主站,同步
模式
UCB0CTL1 = UCSSEL_2 + UCSWRST; //使用SMCLK,保持SW复位
UCB0BR0 = 12; // fSCL = SMCLK / 12 =〜100kHz
UCB0BR1 = 0;
UCB0I2CSA = 0x21; //设置从站地址
UCB0CTL1 &=〜UCSWRST; //清除软件重置,继续
手术
IE2 | = UCB0RXIE; //启用RX中断
TACTL = TASSEL_2 + MC_2; // SMCLK,连续模式

while (1)
{
RxByteCtr = 2; //加载RX字节计数器
UCB0CTL1|= UCTXSTT; // I2C start condition
__bis_SR_register(CPUOFF + GIE); //输入LPM0,启用
打断
//保留在LPM0中,直到全部
数据
// is RX'd
if (RxWord > 200)
P1OUT |= 0x01;
else
P1OUT &= ~0x01;

__disable_interrupt();
TACCTL0 | = CCIE; //使能TACCR0中断
__bis_SR_register(CPUOFF + GIE); //输入LPM0,启用
打断
//保留在LPM0中,直到
TACCR0
// interrupt occurs
TACCTL0 &=〜CCIE; //禁止TACCR0中断
}
}

#pragma vector = TIMERA0_VECTOR
__interrupt void TA0_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); //退出LPM0
}

// USCIAB0TX_ISR的结构使其可以用来接收
任何
//通过预加载RxByteCtr和字节数来获得2+字节数。
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
RxByteCtr--; //递减RX字节计数器

if (RxByteCtr)
{
RxWord =(无符号整数)UCB0RXBUF<<8; //获取接收的字节
if(RxByteCtr == 1)//仅剩一个字节?
UCB0CTL1 | = UCTXSTP; //产生I2C停止
健康)状况
}
else
{
RxWord | = UCB0RXBUF; //获取最后收到的字节
//结合MSB和LSB
__bic_SR_register_on_exit(CPUOFF); //退出LPM0
}
}
本质上,您使用地址将命令发送到从设备
然后等待从属设备的响应。为了做
为此,您必须设置计时器,控制寄存器,I2c协议等
在主循环中完成。这是在主同步模式下设置的,因此
一台设备(主设备)可以控制许多其他设备(从设备)。这
在此示例中使用的从机地址是UCB0I2CSA = 0x21。所以一次
一切都已经设置好了,是时候实际使用I2c协议了。
UCB0CTL1| = UCTXSTT;将通过调用从机地址来启动i2c
存储在UCB0I2CSA中。现在由奴隶来认识它是
被调用并发送适当的响应。加速度计将
布局需要发送给它的内容到所需的任何数据(x,y或z
轴尺寸)。该程序将保留在lpm中,直到数据
已收到。一旦收到所有信息,便会设置停止条件。

要真正了解如何使用微型仪器,请查看TI数据表。
它将详细介绍每件事,并告诉您确切的内容
要设置的寄存器。这确实是学习这些东西的唯一方法。

---在...中,“宋歌”写道:
>
> Hi group,
>
>我必须通过以下方式从从属传感器(LSM303DLM:Accelerometer)接收数据
I2C。但是我不太清楚如何制作转码& receive.
>
>这是我的I2C寄存器设置代码。但是我不知道该怎么做
接近此代码的下一个。我只想传送从站地址,
注册地址和数据。然后从从属传感器接收数据
不断地。在线有很多示例代码,但我不能
了解它们...请让我知道示例代码或一些重定向。
谢谢你。
> void SetI2C (void)
> {
>UCB0CTL1 | = UCSWRST; // **将状态机置于复位状态**
>UCB0CTL0 | = UCMST | UCSYNC | UCMODE_3;
>//主模式,7位地址,I2C模式
>
>UCB0CTL1 | = UCSSEL_2; // SMCLK
>UCB0BR0 = 0x04; // / 4-2.304 MHz
> UCB0BR1 = 0;
>UCB0I2CSA = ACC_ADDRESS_W;
> UCB0CTL1 &=〜UCSWRST; // **初始化USCI状态机**
>UCB0IE = UCNACKIE;
> }
>

非常感谢您的帮助。

我对寄存器UCB0I2CSA有一个问题。

如果我参加从从属传感器接收数据,则操作协议就像 this.

主:ST SAD + W SUB SR SAD + R MAK ....
从站:SAK SAK SAK DATA .......

我认为主机在从机发送数据之前应先发送SAD + W,SUB和SAD + R。但是我 不知道UCB0I2CSA的功能。
如果我将从站的地址SAD + W分配给UCB0I2CSA,则将SAD + W发送给从站(UCB0TXBUF =不需要SAD + W)?我应该只使用UCTXSTT并发送SUB,SAD + R吗?
渲染下来,我想知道何时通过I2C,UCB0I2CSA做某事 自动发送给奴隶?

谢谢你。
---在m ...中,“ gymb321”写道:
>
>#include unsigned int RxByteCtr;
>unsigned int RxWord;
>
> void main(void)
> {
>WDTCTL = WDTPW + WDTHOLD; //停止WDT
>P1DIR | = 0x01; // P1.0输出
>P3SEL | = 0x06; //将I2C引脚分配给
> USCI_B0
>UCB0CTL1 | = UCSWRST; //启用软件重置
>UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C主站,同步
> mode
>UCB0CTL1 = UCSSEL_2 + UCSWRST; //使用SMCLK,保持SW复位
>UCB0BR0 = 12; // fSCL = SMCLK / 12 =〜100kHz
> UCB0BR1 = 0;
>UCB0I2CSA = 0x21; //设置从站地址
> UCB0CTL1 &=〜UCSWRST; //清除软件重置,继续
> operation
>IE2 | = UCB0RXIE; //启用RX中断
>TACTL = TASSEL_2 + MC_2; // SMCLK,连续模式
>
> while (1)
> {
>RxByteCtr = 2; //加载RX字节计数器
>UCB0CTL1 | = UCTXSTT; // I2C启动条件
>__bis_SR_register(CPUOFF + GIE); //输入LPM0,启用
> interrupts
>//保留在LPM0中,直到全部
> data
>//被RX了
> if (RxWord > 200)
>P1OUT | = 0x01;
> else
> P1OUT &= ~0x01;
>
>__disable_interrupt();
>TACCTL0 | = CCIE; //使能TACCR0中断
>__bis_SR_register(CPUOFF + GIE); //输入LPM0,启用
> interrupts
>//保留在LPM0中,直到
> TACCR0
>//发生中断
> TACCTL0 &=〜CCIE; //禁止TACCR0中断
> }
> }
>
>#pragma vector = TIMERA0_VECTOR
>__interrupt void TA0_ISR(void)
> {
>
> }
>
>// USCIAB0TX_ISR的结构使其可以用来接收
> any
>//通过预加载RxByteCtr和字节数来获得2+字节数。
>#pragma vector = USCIAB0TX_VECTOR
>__interrupt void USCIAB0TX_ISR(void)
> {
>RxByteCtr--; //递减RX字节计数器
>
> if (RxByteCtr)
> {
>RxWord =(无符号整数)UCB0RXBUF<<8; //获取接收的字节
>if(RxByteCtr == 1)//仅剩一个字节?
>UCB0CTL1 | = UCTXSTP; //产生I2C停止
> condition
> }
> else
> {
>RxWord | = UCB0RXBUF; //获取最后收到的字节
>//结合MSB和LSB
>__bic_SR_register_on_exit(CPUOFF); //退出LPM0
> }
> }
>本质上,您使用地址将命令发送到从设备
>然后等待从属设备的响应。为了做
>为此,您必须设置计时器,控制寄存器,I2c协议等
>
>一台设备(主设备)可以控制许多其他设备(从设备)。这
>在此示例中使用的从机地址是UCB0I2CSA = 0x21。所以一次
>一切都已经设置好了,是时候实际使用I2c协议了。
>UCB0CTL1 | = UCTXSTT;将通过调用从机地址来启动i2c
>存储在UCB0I2CSA中。现在由奴隶来认识它是
>被调用并发送适当的响应。加速度计将
>布局需要发送给它的内容到所需的任何数据(x,y或z
>轴尺寸)。该程序将保留在lpm中,直到数据
>已收到。一旦收到所有信息,便会设置停止条件。
>
>要真正了解如何使用微型仪器,请查看TI数据表。
>它将详细介绍每件事,并告诉您确切的内容
>要设置的寄存器。这确实是学习这些东西的唯一方法。
>
>---在...中,“宋歌”写道:
> >
> > Hi group,
> >
> >我必须通过以下方式从从属传感器(LSM303DLM:Accelerometer)接收数据
>I2C。但是我不太清楚如何制作转码& receive.
> >
> >这是我的I2C寄存器设置代码。但是我不知道该怎么做
>接近此代码的下一个。我只想传送从站地址,
>注册地址和数据。然后从从属传感器接收数据
>不断地。在线有很多示例代码,但我不能
>了解它们...请让我知道示例代码或一些重定向。
> Thank you.
> >
> >
> > void SetI2C (void)
> > {
> >UCB0CTL1 | = UCSWRST; // **将状态机置于复位状态**
> >UCB0CTL0 | = UCMST | UCSYNC | UCMODE_3;
> >//主模式,7位地址,I2C模式
> >
> >UCB0CTL1 | = UCSSEL_2; // SMCLK
> >UCB0BR0 = 0x04; // / 4-2.304 MHz
> > UCB0BR1 = 0;
> >UCB0I2CSA = ACC_ADDRESS_W;
> > UCB0CTL1 &=〜UCSWRST; // **初始化USCI状态机**
> >UCB0IE = UCNACKIE;
> > }
>