This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
主机模式初始化:
/******************************************************
** 函数名:void IIC_MasterInit(void)
** 描述 :从机初始化
** 输入 : 无
** 输出 :无
** 返回 :无
******************************************************/
void IIC_MasterInit(void)
{
P1OUT = 0XFF;
/* 选择P1.6 P1.7的第二功能 */
P1SEL |= BIT6 + BIT7;
P1SEL2|= BIT6 + BIT7;
/* 初始化之前置为UCSWRST,然后开始所有的寄存器的初始化 */
UCB0CTL1 |= UCSWRST;
/* 配置为主机方式 */
UCB0CTL0 =UCMST;
/* 配置从机模式为异步通信方式,IIC模式 */
UCB0CTL0 = UCMODE_3 + UCSYNC+ UCA10;
/*********************************
** 设置对应的时钟,同时置为UCSWRST
** 设置IIC速度寄存器UCB0BR0 UCB0BR1的值
** 设置从机地址寄存器 UCB0I2CSA的值
** 设置自身地址寄存器 UCB0I2COA的值
** Disable寄存器UCSWRST
*********************************/
UCB0CTL1 = UCSSEL_2+UCSWRST;
UCB0BR0 = 12; //设置IIC的时钟速度
UCB0BR1 = 0;
UCB0I2CSA = 0XA0; //配置从机地址
UCB0CTL1 &= ~UCSWRST;
}
写字节函数:
/******************************************************
** 函数名:void WriteByte(unsigned char addr,unsigned char data)
** 描述 :硬件IIC写入单个数据data操作
** 输入 : addr从机地址,data待写入的数据
** 输出 :无
** 返回 :无
******************************************************/
void WriteByte(unsigned char addr,unsigned char data)
{
/*
UCB0I2CSA = 0XA0>>1; //slave address
UCB0CTL1 |= UCTR;//写
UCB0CTL1 |= UCTXSTT; //start condition,当产生了起始信号后,UCB0TXIFG被自动置一
while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,为空则UCB0TXIFG为1.
UCB0TXBUF = 0x00;
while((UCB0CTL1 & UCTXSTT) == UCTXSTT);//检测从机ACK信号,有ACK信号,则UCTXSTT自动清零
//以上顺序不能改变
while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,
UCB0TXBUF = 0x01;
while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//记住操作符号必须打括号,要不然会出现不可预测的错误,比如这个(IFG2 & UCB0TXIFG) != UCB0TXIFG,括号不能省略
UCB0CTL1 |= UCTXSTP;
*/
UCB0I2CSA=0XA0; // Slave Address is 38h
while(UCB0CTL1 & UCTXSTT); // Ensure stop condition got sent
UCB0CTL1 |=UCTXSTT + UCTR; // I2C TX, start conditio
while(!(IFG2 & UCB0TXIFG)); // Wait USCI_B0 TX flag Flag reset automaticall
while(UCB0CTL1 & UCTXSTT); //检测从机ACK信号,有ACK信号,则UCTXSTT自动清零
UCB0TXBUF=addr; // Load TX buffer
//以上顺序不能改变
while(!(IFG2 & UCB0TXIFG));
__delay_cycles(10);
UCB0TXBUF=data;
while(!(IFG2 & UCB0TXIFG));
__delay_cycles(10);
UCB0CTL1 |=UCTXSTP; // I2C stop condition
IFG2 &=UCB0TXIFG; // Clear USCI_B0 TX int flag
delay_ms(10);
}
读自己函数:
/*******************************************************************************************
** 函数名称:void Readpage(unsigned char *RamAddress,unsigned char addr,unsigned char bytes)
** 功能描述:连续写数据
** 入口参数: *RamAddress读取的数据 addr 从机的数据地址位 bytes读取数据的个数
** 出口参数:无
*******************************************************************************************/
void Readpage(unsigned char *RamAddress,unsigned char addr,unsigned char bytes)
{
UCB0I2CSA =WRITEADDR; // Slave Address is 38h
//while(UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
UCB0CTL1 |=UCTXSTT; // I2C TX, start condition
UCB0CTL1 |=UCTR;
while(UCB0CTL1 & UCTXSTT);
//while(!(IFG2 & UCB0TXIFG)); // Wait USCI_B0 TX flag Flag reset automatically
UCB0TXBUF =addr; // Load TX buffer
//while(!(IFG2 & UCB0TXIFG));
IFG2 &= ~UCB0TXIFG;
UCB0CTL1 &=~UCTR;
while(UCB0CTL1 & UCTXSTP);
UCB0CTL1 |=UCTXSTT;
while(UCB0CTL1 & UCTXSTT);
while(bytes!=1)
{
//while(! (IFG2 & UCB0RXIFG));
*RamAddress=UCB0RXBUF;
UCB0CTL1&=~UCTXNACK;
RamAddress++;
bytes--;
}
UCB0CTL1 |= UCTXSTP+UCTXNACK; //发送停止信号必须再读取最后一个数据之前
//while(!(IFG2 & UCB0RXIFG));
*RamAddress=UCB0RXBUF;
UCB0CTL1 |= UCTXSTP+UCTXNACK; //这里放就不可以了
while(UCB0CTL1 & UCTXSTP);
delay_ms(10);
}
void delay_ms(unsigned int ms)
{
unsigned int i,j;
for( i = 0; i < ms; i++ )
{
for( j = 0; j < 1141; j++ );
}
}