4963|5

76

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【求助】MSP430读写8563问题 [复制链接]

请问哪位知道8563与430I2C通信问题,为什么我的430总是不能读到8563的应答低电平,SDA,SCL都加了上拉,430的输入口也正常,这几天一直被这个问题困饶,请大家帮我解决一下多谢!下面是我的程序,帮我看一下哪有问题
P1.1做SDA,P1.2做SCL
void i2c_start (void)
{
P1DIR |= BIT1;
P1DIR |= BIT2;
P1OUT &=~BIT2;//sclk = 0;
P1OUT |= BIT1;//sda = 1;
P1OUT |= BIT2;//sclk = 1;
P1OUT &=~BIT1;//sda = 0;
}

void i2c_stop (void)
{
P1DIR |= BIT1;
P1DIR |= BIT2;
P1OUT &= ~BIT2;//sclk = 0;
P1OUT &= ~BIT1;//sda = 0;
P1OUT |= BIT2;//sclk = 1;
P1OUT |= BIT1;//sda = 1;
}

void i2c_send_data (unsigned char sd)
{
unsigned char i;
P1DIR |= BIT1;
P1OUT &= ~BIT2;//sclk = 0;
for (i = 0; i < 8; i++)
{

if(sd & 0x80) P1OUT |= BIT1;
else P1OUT &= ~BIT1;
P1OUT &= ~BIT2; //sclk = 0;
P1OUT |= BIT2;//sclk = 1;
sd <<= 1;
P1OUT &= ~BIT2;//sclk = 0;
}
P1OUT &= ~BIT2;//sclk = 0;
P1OUT |= BIT1;//sda = 1; //发送8个字节后sda产生高电平标志位
P1DIR &= ~BIT1;
P1OUT |= BIT2;//sclk = 1;
P1OUT &= ~BIT2;//sclk = 0;
do
{
i = (P1IN & BIT1);//i = sda;//?
}
while(i);
}

void i2c_receive_data (unsigned char *p_rd)
{
unsigned char rda = 0, i;
P1DIR |= BIT1;
P1OUT &= ~BIT2;//sclk = 0;
P1OUT |= BIT1;//sda = 1;
P1DIR &= ~BIT1;
for (i = 0; i < 8; i++)
{
P1OUT &= ~BIT2;//sclk = 0;
rda <<= 1;
P1OUT |= BIT2;//sclk = 1;
rda |= ((P1IN&BIT1)>>1);//SDA

}
P1OUT &= ~BIT2;//sclk = 0;
P1DIR |= BIT1;
P1OUT &= ~BIT1;//sda = 0;
P1OUT |= BIT2;//sclk = 1;
*p_rd = rda;
}

最新回复

你们好能帮我看看吗,用串行助手显示,收的都是FF,调了几天没通过,烦 void I2C_Set_sda_high(void); void I2C_Set_sda_low (void); void I2C_Set_sck_high(void); void I2C_Set_sck_low (void); bool  I2C_GetACK(void); void I2C_SetACK(void); void I2C_SetNAk(void); void I2C_START(void); void I2C_STOP(void); bool I2C_TxHToL(unsigned char); unsigned char  I2C_RxByte(void); void I2C_Read ( unsigned char  *b8563_Store); //void I2C_read_string(unsigned char address,unsigned char count,unsigned char *readbuf); void  I2C_Write( void); //void Delay_ms(unsigned long nValue); //static unsigned char c8563_Store[7]={0x18,0x59,0x23,0x25,0x12,0x25,0x06}; /*写入时间初值:2506年25月27日 09:59:00  BCD码*/ const unsigned char cucBit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; #define SDA  BIT6 #define SCL  BIT5 void DelayTime1(void) {   _NOP();_NOP();_NOP();//_NOP();//_NOP();_NOP();_NOP();_NOP(); } void I2C_Set_sda_high( void ) {    P5DIR &= ~(SDA); } void I2C_Set_sda_low ( void ) {     P5DIR |= SDA;                    P5OUT &= ~(SDA);                } void I2C_Set_sck_high( void ) {   P5DIR &= ~(SCL); } void I2C_Set_sck_low ( void ) {     P5DIR |= SCL;                    P5OUT &= ~(SCL);                } /******* msp425 <-- pcf8563******/ bool  I2C_GetACK(void) { unsigned int ucErrTime=255;    //I2C_Set_sck_low();     I2C_Set_sda_high();     //DelayTime1();     I2C_Set_sck_high();         // DelayTime1();     // P5DIR &= ~(SDA);   while((P5IN & SDA))    {      ucErrTime--;      if(ucErrTime==0)      {        I2C_STOP();        return 0;      }    }    I2C_Set_sck_low();     return 1; }    /****** msp425 ---> pcf8563*******/ void I2C_SetACK(void) {     //I2C_Set_sck_low();     I2C_Set_sda_low();       // DelayTime1();     I2C_Set_sck_high();       // DelayTime1();     I2C_Set_sck_low(); } /********msp425 ---> pcf8563******/ void I2C_SetNAk(void) {   // I2C_Set_sck_low();     I2C_Set_sda_high();            //DelayTime1();     I2C_Set_sck_high();            // DelayTime1();    I2C_Set_sck_low(); } void I2C_START(void) {     I2C_Set_sck_high(); I2C_Set_sda_high(); // DelayTime1();   I2C_Set_sda_low();    //DelayTime1();    I2C_Set_sck_low();         } void I2C_STOP(void) {        I2C_Set_sck_low();   I2C_Set_sda_low();     // DelayTime1();       I2C_Set_sck_high();    // DelayTime1();         I2C_Set_sda_high();            } /****** msp425 ----> pcf8563*****/ bool I2C_TxHToL(unsigned char nValue)//MSP425发送单字节数据 从高位到低位 {     unsigned int i;         for(i = 0;i < 8;i++)     {         //I2C_Set_sck_low();      //  DelayTime1();             if(nValue & cucBit!=0)         {                 I2C_Set_sda_high();         }             else         {                 I2C_Set_sda_low();         }                    //DelayTime1();             I2C_Set_sck_high();             //DelayTime1();          } I2C_Set_sck_low(); return 1; } ///////////////////////////////////////////// /**** msp425 <-- pcf8563 *****/ unsigned char  I2C_RxByte(void)  //MSP425接收单字节数据 {     unsigned char nTemp = 0x00;     unsigned int i;             I2C_Set_sda_high();                                 //将SDA管脚设置为输入方向    for(i = 0;i < 8;i++)     {         I2C_Set_sck_low();         // DelayTime1();         I2C_Set_sck_high();         // DelayTime1();       if(P5IN & SDA)       {             nTemp |=cucBit;       }         }   I2C_Set_sck_low();     return nTemp; } /////////////////////////////////////////// void I2C_Read ( unsigned char  *b8563_Store) //MSP425读指定地址address寄存器中的内容 {    I2C_START();                        // 启动数据总线     I2C_TxHToL(0xA2);                        // 发送读时间信息命令      I2C_GetACK();               // 等待 ACK         I2C_TxHToL(0x02);     I2C_GetACK();                   I2C_START();           I2C_TxHToL(0xA3);           I2C_GetACK();       b8563_Store[0] = (I2C_RxByte()&0x7f);      I2C_SetACK();         b8563_Store[1] =(I2C_RxByte()&0x7f);      I2C_SetACK();       b8563_Store[2] = (I2C_RxByte()&0x3f);      I2C_SetACK();            b8563_Store[3] = (I2C_RxByte()&0x3f);      I2C_SetACK();           b8563_Store[4] = (I2C_RxByte()&0x07);       I2C_SetACK();             b8563_Store[5] = (I2C_RxByte()&0x1f);      I2C_SetACK();          b8563_Store[6] = I2C_RxByte();     I2C_SetNAk();             I2C_STOP();                                // 停止总线     } void  I2C_Write( void) {    I2C_START();                        // 启动数据总线     I2C_TxHToL(0xA2);        // 发送写时间信息命令     I2C_GetACK();                // 等待 ACK           I2C_TxHToL(0x02);     I2C_GetACK();                // 等待 ACK        I2C_TxHToL(0x58);     I2C_GetACK();                // 等待 ACK           I2C_TxHToL(0x49);     I2C_GetACK();                 I2C_TxHToL(0x21);     I2C_GetACK();                I2C_TxHToL(0x05);     I2C_GetACK();                 I2C_TxHToL(0x01);     I2C_GetACK();             I2C_TxHToL(0x11);     I2C_GetACK();                  I2C_TxHToL(0x06);     I2C_GetACK();            I2C_STOP();                                // 停止总线 } void start_pcf8563_clock(void) {   I2C_START();                        // 启动数据总线   I2C_TxHToL(0xA2);                        // 发送写时间信息命令   I2C_GetACK();                // 等待 ACK     I2C_TxHToL(0x00);   I2C_GetACK();                // 等待 ACK     I2C_TxHToL(0x00); I2C_GetACK();                // 等待 ACK     I2C_STOP();                        }  详情 回复 发表于 2006-12-5 20:39
 
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
430模拟I2C时,当输出低电平时,可以把口直接输出0。但如果想拉高电平,也就是想输出1时,就不能通过口输出1的方法拉高。只能通过将该口的输入输出寄存器改为输入高阻状态,借助上拉电阻拉高。

问题可能出现在这里,你改试试看。有什么进展发个帖子告诉大家。
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你的时钟频率对否啊
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
谢谢各位,我的主频高了,降低时钟就好了,多谢各位的支持
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
二楼说的有理,SDA脚输出1时将引脚切换成输入,靠上拉电阻输出高电平,这样不会与从器件的应答信号冲突。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
你们好能帮我看看吗,用串行助手显示,收的都是FF,调了几天没通过,烦

void I2C_Set_sda_high(void);
void I2C_Set_sda_low (void);
void I2C_Set_sck_high(void);
void I2C_Set_sck_low (void);
bool I2C_GetACK(void);
void I2C_SetACK(void);
void I2C_SetNAk(void);
void I2C_START(void);
void I2C_STOP(void);
bool I2C_TxHToL(unsigned char);
unsigned char I2C_RxByte(void);
void I2C_Read ( unsigned char *b8563_Store);
//void I2C_read_string(unsigned char address,unsigned char count,unsigned char *readbuf);
void I2C_Write( void);
//void Delay_ms(unsigned long nValue);

//static unsigned char c8563_Store[7]={0x18,0x59,0x23,0x25,0x12,0x25,0x06}; /*写入时间初值:2506年25月27日 09:59:00 BCD码*/
const unsigned char cucBit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};


#define SDA BIT6
#define SCL BIT5
void DelayTime1(void)
{

_NOP();_NOP();_NOP();//_NOP();//_NOP();_NOP();_NOP();_NOP();

}

void I2C_Set_sda_high( void )
{
P5DIR &= ~(SDA);
}

void I2C_Set_sda_low ( void )
{
P5DIR |= SDA;
P5OUT &= ~(SDA);
}

void I2C_Set_sck_high( void )
{
P5DIR &= ~(SCL);
}

void I2C_Set_sck_low ( void )
{
P5DIR |= SCL;
P5OUT &= ~(SCL);
}


/******* msp425 <-- pcf8563******/
bool I2C_GetACK(void)
{
unsigned int ucErrTime=255;
//I2C_Set_sck_low();
I2C_Set_sda_high();
//DelayTime1();
I2C_Set_sck_high();

// DelayTime1();
// P5DIR &= ~(SDA);
while((P5IN & SDA))
{
ucErrTime--;
if(ucErrTime==0)
{
I2C_STOP();
return 0;
}
}
I2C_Set_sck_low();
return 1;
}


/****** msp425 ---> pcf8563*******/
void I2C_SetACK(void)
{
//I2C_Set_sck_low();
I2C_Set_sda_low();
// DelayTime1();
I2C_Set_sck_high();
// DelayTime1();
I2C_Set_sck_low();

}

/********msp425 ---> pcf8563******/
void I2C_SetNAk(void)
{

// I2C_Set_sck_low();
I2C_Set_sda_high();
//DelayTime1();
I2C_Set_sck_high();
// DelayTime1();
I2C_Set_sck_low();

}
void I2C_START(void)
{
I2C_Set_sck_high();
I2C_Set_sda_high();

// DelayTime1();
I2C_Set_sda_low();
//DelayTime1();
I2C_Set_sck_low();


}
void I2C_STOP(void)
{

I2C_Set_sck_low();
I2C_Set_sda_low();
// DelayTime1();
I2C_Set_sck_high();
// DelayTime1();
I2C_Set_sda_high();


}

/****** msp425 ----> pcf8563*****/
bool I2C_TxHToL(unsigned char nValue)//MSP425发送单字节数据 从高位到低位
{
unsigned int i;

for(i = 0;i < 8;i++)
{
//I2C_Set_sck_low();
// DelayTime1();
if(nValue & cucBit[i]!=0)
{
I2C_Set_sda_high();
}
else
{
I2C_Set_sda_low();
}

//DelayTime1();
I2C_Set_sck_high();
//DelayTime1();
}
I2C_Set_sck_low();
return 1;

}

/////////////////////////////////////////////

/**** msp425 <-- pcf8563 *****/
unsigned char I2C_RxByte(void) //MSP425接收单字节数据
{
unsigned char nTemp = 0x00;
unsigned int i;

I2C_Set_sda_high();
//将SDA管脚设置为输入方向
for(i = 0;i < 8;i++)
{
I2C_Set_sck_low();
// DelayTime1();
I2C_Set_sck_high();
// DelayTime1();
if(P5IN & SDA)
{
nTemp |=cucBit[i];
}

}
I2C_Set_sck_low();
return nTemp;
}
///////////////////////////////////////////
void I2C_Read ( unsigned char *b8563_Store) //MSP425读指定地址address寄存器中的内容
{
I2C_START(); // 启动数据总线

I2C_TxHToL(0xA2); // 发送读时间信息命令
I2C_GetACK(); // 等待 ACK

I2C_TxHToL(0x02);
I2C_GetACK();

I2C_START();

I2C_TxHToL(0xA3);
I2C_GetACK();


b8563_Store[0] = (I2C_RxByte()&0x7f);
I2C_SetACK();

b8563_Store[1] =(I2C_RxByte()&0x7f);
I2C_SetACK();

b8563_Store[2] = (I2C_RxByte()&0x3f);
I2C_SetACK();

b8563_Store[3] = (I2C_RxByte()&0x3f);
I2C_SetACK();

b8563_Store[4] = (I2C_RxByte()&0x07);
I2C_SetACK();

b8563_Store[5] = (I2C_RxByte()&0x1f);
I2C_SetACK();

b8563_Store[6] = I2C_RxByte();
I2C_SetNAk();

I2C_STOP(); // 停止总线

}








void I2C_Write( void)
{
I2C_START(); // 启动数据总线

I2C_TxHToL(0xA2); // 发送写时间信息命令
I2C_GetACK(); // 等待 ACK

I2C_TxHToL(0x02);
I2C_GetACK(); // 等待 ACK


I2C_TxHToL(0x58);
I2C_GetACK(); // 等待 ACK

I2C_TxHToL(0x49);
I2C_GetACK();

I2C_TxHToL(0x21);
I2C_GetACK();

I2C_TxHToL(0x05);
I2C_GetACK();

I2C_TxHToL(0x01);
I2C_GetACK();
I2C_TxHToL(0x11);
I2C_GetACK();

I2C_TxHToL(0x06);
I2C_GetACK();
I2C_STOP(); // 停止总线

}



void start_pcf8563_clock(void)
{

I2C_START(); // 启动数据总线

I2C_TxHToL(0xA2); // 发送写时间信息命令
I2C_GetACK(); // 等待 ACK

I2C_TxHToL(0x00);
I2C_GetACK(); // 等待 ACK

I2C_TxHToL(0x00);
I2C_GetACK(); // 等待 ACK

I2C_STOP();
}
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表