|
下面是小弟写的一段简单的对430F413的24C02操作的小程序,仿真读不到值,请高手们帮忙看下!
程序大概功能:将a1[0]写入EEPROM,字节地址30,再从30读出a1[0]放入a2[0]!现在问题是读不到值!
#include <msp430x41x.h>
#include"IIC.h"
void InitIIC();
void delay(void);
void start(void);
void stop(void);
void Ack();
void noAck();
unsigned char check();
void write_1 (void);
void write_0(void);
void write_byte(unsigned char input);
unsigned char read_byte();
unsigned char w_r_byte(uchar *p,uchar adr,uchar *p1);
void main()
{
WDTCTL=WDTPW+WDTHOLD;
SCFI0=FLLD_8 ;
EE_ON ;
InitIIC();
uchar a1[2]={0x41,0x00};
uchar a2[2]={0x00,0x01};
w_r_byte(&a1[0],30,&a2[0]);
_NOP();
LPM4;
}
unsigned char w_r_byte(uchar *p,uchar adr,uchar*p1 )//p写入数据字节地址,P1读出数据存储地址指针
{
start();
write_byte(W_DEVICE_ADR); //写器件地址
if(check()==1) return 1;
write_byte(adr); //写字节地址
if(check()==1) return 1;
write_byte(*p) ;//写入数组a1
if(check()==1) return 1;
stop();
start();//read
write_byte(W_DEVICE_ADR ); //写设备地址
if(check()==1) return 1;
write_byte(adr); //写字节地址
if(check()==1) return 1;
start();
write_byte(R_DEVICE_ADR);//设备地址—读
if(check()==1) return 1;
*p1=read_byte();//读出放入a2[]
noAck();
stop();
return 0;
}
***************************************************
IIC.h
/******************************************************************
*******************************************************************/
#include <msp430x41x.h>
#ifndef __IIC
#define __IIC
typedef unsigned char uchar;
typedef unsigned int uint;
#define SDA_IN P1DIR&=~BIT6
#define SDA_OUT P1DIR|=BIT6
#define SCL_OUT P1DIR|=BIT7
#define SDA_VAL P1IN&BIT6//0x40
#define SDA_L P1OUT&=~BIT6
#define SDA_H P1OUT|=BIT6
#define SCL_L P1OUT&=~BIT7
#define SCL_H P1OUT|=BIT7
#define EE_ON (P2OUT &= ~0x01) //24WC02供电
#define EE_OFF (P2OUT |= 0x01) //24WC02断电
#define W_DEVICE_ADR 0xa0 //24C02 的写地址 A0、A1、A2 均为0
#define R_DEVICE_ADR 0xa1 //24c02 的读地址A0、A1、A2 均为0
#endif
/****************************************************
函数功能:延时
*****************************************************/
void delay(void)
{
_NOP();
}
/******************************************************
函数功能;START
*******************************************************/
void start(void)
{
SDA_OUT;
SDA_H;
delay();
SCL_H;
delay();
SDA_L;
delay();
SCL_L;
delay();
}
/************************************************************
函数功能:STOP
*************************************************************/
void stop(void)
{
SDA_OUT;
SCL_L;
delay();
SDA_L;
delay();
SCL_H;
delay();
SDA_H;
delay();
}
/***************************************
函数功能:设置IIC对应IO为输出方向并输出高
电平
****************************************/
void InitIIC()
{
SCL_OUT; //SCL 管脚为输出
SDA_IN; //SDA管脚为输入
SCL_L;
stop();
}
/**************************************************************
函数功能:ACK
***************************************************************/
void Ack()
{
SDA_OUT;
SDA_L;
delay();
SCL_H;
delay();
SCL_L;
delay();
SDA_H;
}
/**********************************************************
函数功能:NOACK
***********************************************************/
void noAck()
{
SDA_OUT;
SDA_H;
delay();
SCL_H;
delay();
SCL_L;
delay();
}
/**********************************************************
函数功能:check
返回 1:错误
0:有应答
**********************************************************/
unsigned char check()
{
unsigned char ack;
SCL_H;
delay();
SDA_IN;
delay();
ack=SDA_VAL;
delay();
SCL_L;
delay();
return(ack);
}
/***************************************
函数功能:对IIC总线写1
****************************************/
void write_1 (void)
{
SDA_H;
delay();
SCL_H;
delay();
SCL_L;
delay();
}
/******************************************
函数功能:对IIC总线写0
*******************************************/
void write_0(void)
{
SDA_L;
delay();
SCL_H;
delay();
SCL_L;
delay();
}
/**********************************************
函数功能:字节写入
***********************************************/
void write_byte(unsigned char input)
{
unsigned char temp,q0;
SDA_OUT;
for(temp=8;temp!=0;temp--)
{
q0=input&0x80;
if(q0==0x80)
SDA_H;
else
SDA_L;
delay();
SCL_H;
delay();
SCL_L;
delay();
input=input<<1;
}
}
/**********************************************************************
函数功能:IIC 总线读8 位数据
返回值:读出的 8 位数据
***********************************************************************/
unsigned char read_byte()
{
unsigned char temp,q0,rbyte=0;
SDA_IN;
for(temp=8;temp!=0;temp--)
{
SCL_H;
delay();
rbyte=rbyte<<1;
SDA_IN;
q0=SDA_VAL;//P1IN&BIT6
if(q0==BIT6)
rbyte=rbyte|0x01;
delay();
SCL_L;
delay();
}
return(rbyte);
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
|