MSP430 iic问题 读取
/*----------------------------------------------------------------------------*//*
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不置位
跪求呀~~~~弄了好几天了。 你I2C总线上挂的设备是什么?就是从设备地址 yang_2010 发表于 2012-9-13 18:16 static/image/common/back.gif
你I2C总线上挂的设备是什么?就是从设备地址
加速度计, 这个我写了 是他的地址,但是过不去。 那个byRA 局部变量调用时候写得是加速度的地址。
通信是好的, 证明 就是那个start的 信号接收到 并把相应位置的SST清零了。
反过来说 就是 即使现在刚发完START 掉线了 那个地址和数据也能发出去吧 ??
{:huffy:}{:smile:} qq逆水舟 发表于 2012-9-17 21:55 static/image/common/back.gif
????????????????? 有用。。。
页:
[1]