|
在根据ZLG网站提供的I2C程序包,修改过了应用在MSP430中。
发现写数据到PCF8563中的时候,JATG仿真过程中写从地址A2后,PCF8563有应答,但是接着写寄存器地址0x02之后,PCF8563就没有应答。
unsigned char IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) 发送数据到PCF8563
{
uchar i;
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0); //此处有应答。
SendByte(suba); /*发送器件子地址*/
if(ack==0)return(0); //此处没有应答,返回0,退出。
Start_I2c();
SendByte(sla+1);
if(ack==0)return(0);
for(i=0;i<no-1;i++)
{
*s=RcvByte(); /*发送数据*/
Ack_I2c(0); /*发送就答位*/
s++;
}
*s=RcvByte();
Ack_I2c(1); /*发送非应位*/
Stop_I2c(); /*结束总线*/
return(1);
}
void SendByte(uchar c) //发送单字节到PCF8563
{
uchar BitCnt;
SDA_OUT;
SCL_OUT;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
{
if((c<<BitCnt)&0x80)
{
SDA_H;
} /*判断发送位*/
else
{
SDA_L;
}
_Nop();
SCL_H; /*置时钟线为高,通知被控器开始接收数据位*/
delay_nus(4);
_Nop();
_Nop(); /*保证时钟高电平周期大于4μs*/
SCL_L;
}
delay_nus(1);
// SDA_H; /*8位发送完后释放数据线,准备接收应答位*/
SDA_IN;
delay_nus(1);
SCL_L;
delay_nus(1);
// delay_1us();
if(SDA_DATA) //判断是否有收到ACK
{
ack=0;
}
else
{
ack=1;
} /*判断是否接收到应答信号*/
SCL_L;
delay_nus(1);
} |
|