tianyaxtujxlg 发表于 2011-9-1 11:58:24

求一个MSP430F249的硬模块I2C程序

求一个MSP430F249的硬模块I2C程序,申明模拟的已经有了,现在想要一个249自带的I2C程序,怎么249的资料里都没有写明这些I2C的寄存器如何设置,如何使用

tianyaxtujxlg 发表于 2011-9-1 12:02:10

回复【楼主位】tianyaxtujxlg
-----------------------------------------------------------------------

发现249的资料资料很少具体涉及哪些寄存器的设置方法???

lcofjp 发表于 2011-9-1 12:14:20

官方网站没有示例程序么?你去找找吧

tianyaxtujxlg 发表于 2011-9-1 15:07:15

回复【2楼】lcofjp C语言砖家
-----------------------------------------------------------------------

硬件I2C的还真是没找到,真奇怪,怎么会没有这个的程序,明明249是有这个功能的,竟然没人写这个功能的程序,连官网都没有

lcofjp 发表于 2011-9-1 16:22:17

http://www.ti.com/product/msp430f249?qgpn=msp430f249
MSP430F23x, MSP430F24x(1), MSP430F2410 Code Examples (Rev. E)(ZIP 431 KB )   1,611 views
官网是有的,是你没注意好好看吧。
msp430x24x_uscib0_i2c_01.c等等
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;               // Stop WDT
P1OUT= 0;
P1DIR |= 0x01;                            // P1.0 output
P3SEL |= 0x06;                            // Assign I2C pins to USCI_B0
UCB0CTL1 |= UCSWRST;                      // Enable SW reset
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;   // I2C Master, synchronous mode
UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
UCB0BR0 = 12;                           // fSCL = SMCLK/12 = ~100kHz
UCB0BR1 = 0;
UCB0I2CSA = 0x4E;                         // Set slave address
UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
IE2 |= UCB0RXIE;                        // Enable RX interrupt
TACTL = TASSEL_2 + MC_2;                  // SMCLK, contmode

while (1)
{
    RxByteCtr = 2;                        // Load RX byte counter
    UCB0CTL1 |= UCTXSTT;                  // I2C start condition
    __bis_SR_register(CPUOFF + GIE);      // Enter LPM0, enable interrupts
                                          // Remain in LPM0 until all data
                                          // is RX'd

    if (RxWord < 0x1d00)                  // >28C?
      P1OUT &= ~0x01;                     // No, P1.0 = 0
    else
      P1OUT |= 0x01;                        // Yes, P1.0 = 1

    __disable_interrupt();
    TACCTL0 |= CCIE;                        // TACCR0 interrupt enabled
    __bis_SR_register(CPUOFF + GIE);      // Enter LPM0, enable interrupts
                                          // Remain in LPM0 until TACCR0
                                          // interrupt occurs
    TACCTL0 &= ~CCIE;                     // TACCR0 interrupt disabled
}
}

tianyaxtujxlg 发表于 2011-9-3 11:30:44

回复【4楼】lcofjp C语言砖家
-----------------------------------------------------------------------

非常感谢四楼提供的代码,我找这个硬I2C的程序找好久了,一直就没找到,另外有没有关于硬I2C的寄存器具体设置方法和数据手册,我也是找了好久也没找到,如果楼上有的话,传一份给我吧!我的邮箱是57462554@qq.com

jlhgold 发表于 2011-9-3 12:51:38

回复【5楼】tianyaxtujxlg
-----------------------------------------------------------------------

找不到用户手册么?
用户手册:
http://www.ti.com.cn/cn/lit/ug/slau144h/slau144h.pdf
样例程序:
http://www.ti.com/cn/litv/zip/slac149e

tianyaxtujxlg 发表于 2011-9-5 15:39:54

回复【6楼】jlhgold
-----------------------------------------------------------------------

用户手册倒是有,但是上面只介绍了如何把引脚设为相应的功能,其他具体这种功能的其他寄存器的设置方式一个都没有,249又是新出的一个芯片,弄的我也是找了好久都没有找到,感谢6楼提供的资料!!!

tianyaxtujxlg 发表于 2011-9-7 16:30:50

回复【6楼】jlhgold
-----------------------------------------------------------------------

六楼,你的资料我看了,确实对我帮助很大,在此再次感谢下你,另外还有个问题想向你请教一下,你传的程序包中程序msp430x24x_uscib0_i2c_15,程序中的这两条语句是什么意思,我也是查了很多手册,但是还是没看明白,还望六楼帮忙解释一下:

__bis_SR_register(CPUOFF + GIE);      // Enter LPM0 w/ interrupts

__bic_SR_register_on_exit(CPUOFF);      // Exit LPM0

tianyaxtujxlg 发表于 2011-9-7 18:11:47

回复【6楼】jlhgold
-----------------------------------------------------------------------

另外那个I2C程序是靠中断来实现传输数据的,他的具体过程是什么样,什么时候产生的中断,然后他们互相之间的应答位在哪里给出的。我看了程序,好像没有提到应答位的给出,这个是不是硬件自动实现的,还是需要软件编程来实现

jlhgold 发表于 2011-9-13 20:18:09

回复【8楼】tianyaxtujxlg
-----------------------------------------------------------------------

第一个是进入低功耗模式
第二个是退出低功耗模式

回复【9楼】tianyaxtujxlg
-----------------------------------------------------------------------

是硬件实现的,如果需要具体的时序,用户手册(user‘s guide)中有提及。

tianyaxtujxlg 发表于 2011-9-14 18:01:04

回复【10楼】jlhgold
-----------------------------------------------------------------------

可不可以不采用低功耗模式来进行通信,我既要发送,又需要接受。不采用低功耗模式是不是可以直接把两个发送和接受中断函数写成这样就可以了

#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
   UCB0TXBUF = TxData;                   // Transmit data at address PTxData
   TXByteCtr++;                              // Increment TX byte counter
}

#pragma vector = USCIAB0RX_VECTOR
__interrupt void USCIAB0RX_ISR(void)
{

    RxBuffer = UCB0RXBUF;                   // Move RX data to address PRxData
    RXByteCtr++;
}                                           // received
页: [1]
查看完整版本: 求一个MSP430F249的硬模块I2C程序