📄 iic.c
字号:
#include <msp430xg46x.h>
#define TRUE 1
#define FALSE 0
#define NO_ACK (UCB0STAT & UCNACKIFG)
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 = 1048576L / 100000L;
UCB0BR0 = i2c_baud & 0xFF;
UCB0BR1 = i2c_baud >> 8;
UCB0CTL1 &= ~UCSWRST;
}
void i2c_start(unsigned char iic_addr,unsigned int sub_addr,unsigned char mode)
{
UCB0I2CSA = iic_addr;
if (mode == 0)
UCB0CTL1 |= UCTR;
UCB0CTL1 |= UCTXSTT;
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) != UCB0TXIFG); /*等待发送完*/
UCB0TXBUF = data;
}
void i2c_recv(unsigned char *ptr)
{
while(!(IFG2 & UCB0RXIFG)); /*等待接收完*/
*ptr = 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;
}
else if(!NO_ACK)
i2c_send(*ptr++);
}
if(NO_ACK) /*未收到确认*/
{
i2c_stop();
return FALSE;
}
i2c_stop();
return TRUE;
}
unsigned char a = 10, b = 0;
void main()
{
WDTCTL = WDTPW + WDTHOLD;
init_i2c();
i2c_write(0x50,0x00, &a, 1);
while(1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -