msp430g2533之iic(硬件iic)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wuweiwangyao/article/details/52329862
#include <msp430g2533.h>
#include <stdio.h>
unsigned int RxByteCtr;
unsigned int RxWord;
volatile int j;
float temp;


void UART0_send_byte(unsigned char data)
{
for( j=10000;j>0;j--);
UCA0TXBUF=data;
}


void UART0_send_str(char *s)
{
    while(*s != '\0')
    {
        UART0_send_byte(*s++);
    }
}


void UART0()
{
DCOCTL = 0;                               // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
DCOCTL = CALDCO_1MHZ;
P1SEL |= BIT1 + BIT2 ;                    // P1.1 = RXD, P1.2=TXD
P1SEL2 |= BIT1 + BIT2 ;                   // P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_2;                     // SMCLK
UCA0BR0 = 104;                            // 1MHz 9600
UCA0BR1 = 0;                              // 1MHz 9600
UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
}




void IIC()
{


P1SEL |= BIT6 + BIT7;                  // Assign I2C pins to USCI_B0
P1SEL2|= BIT6 + BIT7;                  // 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 = 0x48;                      // Set slave address
UCB0CTL1 &= ~UCSWRST;                  // Clear SW reset, resume operation
IE2 |= UCB0RXIE;                       // Enable RX interrupt
TACTL = TASSEL_2 + MC_2;              // SMCLK, contmode
}






int main(void)
{
char buf[10];
    WDTCTL = WDTPW + WDTHOLD;


    if (CALBC1_1MHZ==0xFF) // If calibration constant erased
      {
        while(1);                          // do not load, trap CPU!!
      }
    IIC();
    UART0();
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'
    temp=(float)RxWord/256;
sprintf(buf,"%f\n",temp);
UART0_send_str(buf);


__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
}
}


#pragma vector = TIMER0_A0_VECTOR
__interrupt void TA0_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0
}


// The USCIAB0TX_ISR is structured such that it can be used to receive any
// 2+ number of bytes by pre-loading RxByteCtr with the byte count.
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
RxByteCtr--;          // Decrement RX byte counter


if (RxByteCtr)
{
RxWord = (unsigned int)UCB0RXBUF << 8; // Get received byte
if (RxByteCtr == 1)                       // Only one byte left?
UCB0CTL1 |= UCTXSTP;                 // Generate I2C stop condition
}
else
{
RxWord |= UCB0RXBUF;                 // Get final received byte,
// Combine MSB and LSB
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0
}
}
展开阅读全文

IIC

07-11

I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。rn为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。设备上的串行数据线SDA接口电路应该是双向的,输出电路用于向总线上发送数据,输入电路用于接收总线上的数据。而串行时钟线也应是双向的,作为控制总线数据传送的主机,一方面要通过SCL输出电路发送时钟信号,另一方面还要检测总线上的SCL电平,以决定什么时候发送下一个时钟脉冲电平;作为接受主机命令的从机,要按总线上的SCL信号发出或接收SDA上的信号,也可以向SCL线发出低电平信号以延长总线时钟信号周期。总线空闲时,因各设备都是开漏输出,上拉电阻Rp使SDA和SCL线都保持高电平。任一设备输出的低电平都将使相应的总线信号线变低,也就是说:各设备的SDA是“与”关系,SCL也是“与”关系。rn总线对设备接口电路的制造工艺和电平都没有特殊的要求(NMOS、CMOS都可以兼容)。在I2C总线上的数据传送率可高达每秒十万位,高速方式时在每秒四十万位以上。另外,总线上允许连接的设备数以其电容量不超过400pF为限。rn总线的运行(数据传输)由主机控制。所谓主机是指启动数据的传送(发出启动信号)、发出时钟信号以及传送结束时发出停止信号的设备,通常主机都是微处理器。被主机寻访的设备称为从机。为了进行通讯,每个接到I2C总线的设备都有一个唯一的地址,以便于主机寻访。主机和从机的数据传送,可以由主机发送数据到从机,也可以由从机发到主机。凡是发送数据到总线的设备称为发送器,从总线上接收数据的设备被称为接受器。rnI2C总线上允许连接多个微处理器以及各种外围设备,如存储器、LED及LCD驱动器、A/D及D/A转换器等。为了保证数据可靠地传送,任一时刻总线只能由某一台主机控制,各微处理器应该在总线空闲时发送启动数据,为了妥善解决多台微处理器同时发送启动数据的传送(总线控制权)冲突,以及决定由哪一台微处理器控制总线的问题,I2C总线允许连接不同传送速率的设备。多台设备之间时钟信号的同步过程称为同步化 论坛

没有更多推荐了,返回首页