📄 usci_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 + -