⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usci_i2c.c

📁 TI最新推出的MSP430FG461X系列单片机的I2C例程,已调试通过,绝对可用.
💻 C
字号:
#include   "msp430xG46x.h"

#define	NO_ACK	(UCB0STAT & UCNACKIFG)

#define I2CRead   0xA1

#define I2CWrite  0xA0

#define FALSE     0x0 

#define TRUE     0x0 


unsigned char I2c_addr,Slav_addr;

unsigned char *Mem_addr;


void init_i2c()
{	
	//unsigned int i2c_baud;			/*I2C通信速率*/

	P3SEL  |= BIT1 + BIT2;			/*P3.1,P3.2选为I2C功能*/

	UCB0CTL1 |= UCSWRST;		/*控制寄存器位*/

	UCB0CTL0 |= UCMST + UCMODE_3 + UCSYNC;	/*I2C主,模式3为I2C*/

	UCB0CTL1 = UCSSEL_2 + UCSWRST;			/*时钟源选择SMCLK:8M*/

	//i2c_baud = BRCLK / I2C_BAUD;

	//UCB0BR0 = i2c_baud & 0xFF;
	//UCB0BR1 = i2c_baud >> 8;
  
  UCB0BR0 = 11;                             // fSCL = SMCLK/5 = 209.6kHz
  UCB0BR1 = 0;
  //UCB0I2CSA = 0x48;                         // Slave Address is 048h

	UCB0CTL1 &= ~UCSWRST;
  
}


void i2c_start(unsigned char iic_addr,unsigned int sub_addr,unsigned char mode)
{
  //do
  //{
    UCB0I2CSA = iic_addr;
	  //if (mode == 0)
    UCB0CTL1 |= UCTR;
	  UCB0CTL1 |= UCTXSTT;  
  //}
  //while(NO_ACK);
    
  while(UCB0CTL1 & UCTXSTT);   //wait for acknowledges
  
	if((IFG2 & UCB0TXIFG) == UCB0TXIFG)
	{
		UCB0TXBUF = sub_addr & 0xFF;
	}	
        
	//while((UCB0CTL1 & UCTXSTT) == UCTXSTT);		/*从设备确认地址*/
}

void i2c_stop(void)
{
	//while((IFG2 & UCB0TXIFG) != UCB0TXIFG);		/*等待发送完*/
	UCB0CTL1 |= UCTXSTP;
	IFG2 &= ~UCB0TXIFG;
}


void i2c_send(unsigned char *data)
{
	while(!(IFG2 & UCB0TXIFG) );		/*等待发送完*/
	UCB0TXBUF = *data;
}


void i2c_recv(unsigned char *dat)
{
	while(!(IFG2 & UCB0RXIFG));		/*等待接收完*/

	*dat = UCB0RXBUF;
}



unsigned char i2c_write(unsigned char iic_addr,unsigned int sub_addr, unsigned char *ptr, unsigned int  n)
{
	unsigned int  i;

	i2c_start(iic_addr,sub_addr,0);    
    
	for(i = 0; i < n; i++)
	{
		//if(NO_ACK)   /*未收到确认*/
		//{
			//i2c_stop();
			//return FALSE;
		//}
		// if(!NO_ACK)
    //while(!(IFG2 & UCB0TXIFG));
			i2c_send(ptr++); 
	}
    
	//if(NO_ACK)    /*未收到确认*/
	//{
		//i2c_stop();
		//return FALSE;
	//}
        
	i2c_stop();     

	return TRUE;
}

unsigned char i2c_read(unsigned char iic_addr,unsigned int sub_addr, unsigned char *ptr, unsigned int  n)
{
  unsigned int  i;
  
  i2c_start(iic_addr,sub_addr,0);    
  
  UCB0CTL1 &= ~UCTR;
    
	for(i = 0; i < n; i++)
	{

			i2c_recv(ptr++); 
	}
  
          
	i2c_stop();     

	return TRUE;
  
}


void main(void)
{
   unsigned char i;
   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
   
   init_i2c();
   
   I2c_addr=0x50;
   
   Slav_addr=0x50;
   
   Mem_addr=(unsigned char *)0x1200;
   
   for(i=0;i<10;i++)
     {
       
       *Mem_addr++=i;
     }

   while(1)
   {
   Mem_addr=(unsigned char *)0x1200;
   i2c_write(I2c_addr,Slav_addr,Mem_addr,10);
   
   Mem_addr=(unsigned char *)0x1210;
   i2c_read(I2c_addr,Slav_addr,Mem_addr,10);  
   }
   
   
   
   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -