|
/*----------------------------------------------------------------------------*/
/*
File Name : I2C.C
Description :
Author : Jones Lee
Copyright_&Date_&Version : Jones_Studio _&<2012.8.26>_&<V1.0>
Connector Fuction :
Notes :
*/
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/*---Head Files---*/
#include "I2C.h"
/*---Variable Definition--*/
/*---Function Definiton---*/
void I2C_Init(void);
unsigned char I2C_Send_Ctrl(unsigned char CtrlAndAddr);
void I2C_Read_Byte(unsigned char byAD,unsigned char byRA,unsigned char *rxbuffer) ;
void I2C_Write_Byte(unsigned char byAD,unsigned char byRA,unsigned char *txbuffer) ;
void I2C_delay(unsigned char ms);
/*---Macro Definition-----*/
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/*
Fuction Name :
Description :
Input parameter :
Output parameter :
Date :
Author :
Notes :
*/
/*----------------------------------------------------------------------------*/
void I2C_Init(void)
{
P1OUT = 0XFF;
/* 选择P1.6 sclP1.7sda的第二功能 */
P1SEL |= BIT6 + BIT7;
P1SEL2|= BIT6 + BIT7;
// P1REN |= BIT6 + BIT7;
/* 初始化之前置为UCSWRST,然后开始所有的寄存器的初始化 */
UCB0CTL1 |= UCSWRST;
/* 配置为主机方式 */
UCB0CTL0 |=UCMST;
/* 配置从机模式为异步通信方式,IIC模式 */
UCB0CTL0 |= UCMODE_3 + UCSYNC;
/*********************************
** 设置对应的时钟,同时置为UCSWRST
** 设置IIC速度寄存器UCB0BR0 UCB0BR1的值
** 设置从机地址寄存器 UCB0I2CSA的值
** 设置自身地址寄存器 UCB0I2COA的值
** Disable寄存器UCSWRST
*********************************/
UCB0CTL1 |= UCSSEL_2+UCSWRST;
UCB0BR0 = 11; //设置IIC的时钟速度
UCB0BR1 = 0;
//UCB0I2CSA = 0XA6; //配置从机地址
UCB0CTL1 &= ~UCSWRST;
}
/*----------------------------------------------------------------------------*/
/*
Fuction Name :
Description :
Input parameter :
Output parameter :
Date :
Author :
Notes :
*/
/*----------------------------------------------------------------------------*/
void I2C_Read_Byte(unsigned char byAD,unsigned char byRA,unsigned char *rxbuffer)
{
UCB0I2CSA = byAD;
UCB0CTL1 |=UCTR+UCTXSTT; // I2C TX, start condition
while(UCB0CTL1 & UCTXSTT);
UCB0TXBUF = byRA;
while(!(IFG2 & UCB0TXIFG)); 在这里不行 ,为什么??????????????????????????????????????
IFG2 &= ~UCB0TXIFG;
while(UCB0CTL1 & UCTXSTP);
UCB0CTL1 |=UCTXSTT;
*rxbuffer = UCB0RXBUF;
UCB0CTL1&=~UCTXNACK;
UCB0CTL1 |= UCTXSTP; //这里放就不可以了
}
/*----------------------------------------------------------------------------*/
/*
Fuction Name :
Description :
Input parameter :
Output parameter :
Date :
Author :
Notes :
*/
/*----------------------------------------------------------------------------*/
void I2C_Write_Byte(unsigned char byAD,unsigned char byRA,unsigned char *txbuffer)
{
UCB0I2CSA = byAD; //地址
UCB0CTL1 |= UCTR+UCTXSTT; // I2C TX, start condition
while(UCB0CTL1 & UCTXSTT); // Ensure stop condition got sent
//__bis_SR_register(GIE);
while((IFG2 & UCB0TXIFG)!=UCB0TXIFG);//检测UCB0TXBUF是否为空,为空则UCB0TXIFG为1.
// while((UCB0CTL1 & UCTXSTT) == UCTXSTT)//检测从机ACK信号,有ACK信号,则UCTXSTT自动清零
UCB0TXBUF = byRA; //数据地址
while(!(IFG2 & UCB0TXIFG)); //等待发送完成
I2C_delay(0x10);
UCB0TXBUF=*txbuffer; // 发送数据
while(!(IFG2 & UCB0TXIFG)); //等待
IFG2 &=UCB0TXIFG; // Clear USCI_B0 TX int flag
UCB0CTL1 |= UCTXSTP; // I2C stop condition
I2C_delay(0x10);
UCB0CTL1 &= ~UCSWRST;
}
各位大神 。请求问下,就是我的程序上面的问号那个地方,
IFG2 & UCB0TXIFG 在 UCB0TXBUF 清空时候置位。
我写入时候 自动运送到移位寄存器,但是
这里没反应,貌似没有移动,而且 IFG2 的UCB0TXIFG 不置位
跪求呀~~~~ 弄了好几天了。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|