TA的每日心情 | 奋斗 2014-7-24 09:00 |
---|
签到天数: 205 天 连续签到: 1 天 [LV.7]常住居民III
|
小弟草鸟一枚用430模拟IIC通信对AT24C02进行读取,但是从AT24C02中读取出的数据都是0xff,这个问题纠结了好几天,求大侠相助。。
#include "msp430g2553.h"
/******************设置BIT0为SDA数据线,BIT1为时钟线SCL*******************************/
#define SCL_1 P2OUT|=BIT1
#define SCL_0 P2OUT&=~BIT1
#define SDA_IN P2DIR&=~BIT0
#define SDA_OUT P2DIR|=BIT0
#define SDA_1 P2OUT|=BIT0
#define SDA_0 P2OUT&=~BIT0
/**********开启IIC*********************/
void IIC_start()
{
SCL_1;
__delay_cycles(4); //大概延时4us
SDA_OUT;
SDA_1;
__delay_cycles(4);
SDA_0;
__delay_cycles(4);
SCL_0;
__delay_cycles(4);
}
/***************结束IIC***********************/
void IIC_stop()
{
SCL_1;
__delay_cycles(4);
SDA_OUT;
SDA_0;
__delay_cycles(4);
SDA_1;
__delay_cycles(4);
SCL_0;
__delay_cycles(4);
}
/***************向总线写数据********************/
void IIC_writedata(unsigned char data)
{
unsigned char n;
SDA_OUT;
for(n=0;n<8;n++)
{
if(data&0x80)
SDA_1;
else
SDA_0;
asm("NOP");
__delay_cycles(7);
data=data<<1;
SCL_1;
asm("NOP");
//__delay_cycles(7);
asm("NOP");
SCL_0;
asm("NOP");
__delay_cycles(7);
}
SDA_IN;
asm("NOP");
SCL_1;
// while(P2IN&BIT0);
asm("NOP");
asm("NOP");
SCL_0;
__delay_cycles(7);
SDA_OUT;
}
/******************从IIC总线上读一个数据************************/
unsigned char IIC_readdata()
{
unsigned char data,n;
SDA_IN; //读总线数据将sda设置位输入
for(n=0;n<8;n++)
{
data=data<<1;
SCL_1;
asm("NOP");
//__delay_cycles(7);
asm("NOP");
if(P2IN&BIT0)
data=data|0x01;
else
data=data&&0xfe;
SCL_0;
//__delay_cycles(7);
asm("NOP");
asm("NOP");
}
SDA_OUT;
__delay_cycles(7);
return data;
}
/***************向AT24C02中写一个数据******************/
void write_c02(unsigned char add,unsigned char data)
{
IIC_start();
IIC_writedata(0xa0); //选择写数据
IIC_writedata(add);
IIC_writedata(data);
IIC_stop();
}
/****************从AT24C02中读一个数据*******************************/
unsigned char read_c02(unsigned char add)
{
unsigned char data;
IIC_start();
IIC_writedata(0xa0);
IIC_writedata(add);
IIC_start(); //IIC启动信号
IIC_writedata(0xA1); //发送AT24C02的器件地址和读信号
data=IIC_readdata(); //读一个字节数据
IIC_stop(); //产生IIC停止信号
return data;
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
unsigned char test;
DCOCTL = 0x00; // Set DCOCLK to 1MHz
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
P2DIR|=BIT1+BIT2; //BIT1位设定为时钟线scl,BIT2是测试位
P2SEL=0X00;
P2OUT&=~BIT2;
P2REN|=BIT0;
P1OUT=0X00;
asm("NOP");
asm("NOP");
asm("NOp");
write_c02(0x18,4);
test=read_c02(0x18);
while(1)
{
if(test==4)
P2OUT|=BIT2;
if(test==0xff) //这里得出read_c02得到的数据都是0xff,不明白是为什么
{P2OUT^=0X04;__delay_cycles(40000);}
}
}
|
|