#include "stc8h.h"
//#include "ds1307.h"
#include "intrins.h"
#include "I2C.h"
unsigned char IIC_addr = 0x3C ;
//引脚初始化,全部设为上拉
void I2C_pin_init()
{
P1M0 &= ~0x10; //设置P1.4为双向口模式
P1M1 &= ~0x10;
P1M0 &= ~0x20; //设置P1.5为双向口模式
P1M1 &= ~0x20;
P1PU |= 0x10 ; //设置P1.4的上拉电阻
P1PU |= 0x20 ; //设置P1.5的上拉电阻
}
//寄存器初始化
void I2C_Init(void)
{
// CLK_PCKENR1 |= 0x01; //使能IIC外设时钟
I2C_pin_init();
//P_SW2 |= 0x80; //打开扩展寄存器的操作功能
I2CCFG = 0xe0; //使能I2C主机模式
I2CMSST = 0x00; //I2C主机状诚寄存器清0
}
void Wait()
{
while (!(I2CMSST & 0x40));
I2CMSST &= ~0x40;
}
void Start()
{
I2CMSCR = 0x01; //发送START命令
Wait();
}
void SendData(char dat)
{
I2CTXD = dat; //写数据到数据缓冲区
I2CMSCR = 0x02; //发送SEND命令
Wait();
}
void RecvACK()
{
I2CMSCR = 0x03; //发送读ACK命令
Wait();
}
char RecvData()
{
I2CMSCR = 0x04; //发送RECV命令
Wait();
return I2CRXD;
}
void SendACK()
{
I2CMSST = 0x00; //设置ACK信号
I2CMSCR = 0x05; //发送ACK命令
Wait();
}
void SendNAK()
{
I2CMSST = 0x01; //设置NAK信号
I2CMSCR = 0x05; //发送ACK命令
Wait();
}
void Stop()
{
I2CMSCR = 0x06; //发送STOP命令
Wait();
}
//读取连续接收到的数据,读取多个数据
unsigned char I2C_ReceiveData(unsigned char *ptime,unsigned char num)
{
unsigned char i=0;//cnt=0;
for( i = 0 ; i < num ; i ++ )
{
ptime[i] = RecvData() ; //读取秒值
if( i == 6 )
{
SendNAK() ;
}
else
{
SendACK();
}
}
return 0;
}
/*
void Delay()
{
int i;
for (i=0; i<3000; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}*/
//读寄存器中的数据
unsigned char I2C_Read_Byte(unsigned char reg, unsigned char *p_data)
{
unsigned int cnt = 0;
Start(); //发送起始命令
SendData(IIC_addr<<1); //发送设备地址+写命令
RecvACK();
SendData(reg); //发送存储地址
RecvACK();
//Stop(); //发送停止命令
Start(); //发送起始命令
SendData((IIC_addr<<1)|0x01); //发送设备地址+读命令
//SendACK();
RecvACK();
I2C_ReceiveData(p_data,7);
//SendNAK() ;
Stop(); //发送停止命令
//Delay();
return 1;
}
//读单个字节并反回
unsigned char I2cread(unsigned char reg)
{
//unsigned int cnt = 0;
unsigned char p_data = 0 ;
Start(); //发送起始命令
SendData(IIC_addr<<1); //发送设备地址+写命令
RecvACK();
SendData(reg); //发送存储地址
RecvACK();
//Stop(); //发送停止命令
Start(); //发送起始命令
SendData((IIC_addr<<1)|0x01); //发送设备地址+读命令
//SendACK();
RecvACK();
I2C_ReceiveData(&p_data,1);
//SendNAK() ;
Stop(); //发送停止命令
//Delay();
return p_data;
}
//向相应的寄存器中写入相应的值
unsigned char I2C_Write_Byte(unsigned char reg,unsigned char dat )
{
unsigned int cnt = 0;
Start(); //发送起始命令
SendData(IIC_addr<<1); //发送设备地址+写命令
RecvACK();
SendData(reg); //发送存储地址
RecvACK();
SendData(dat); //设置小时值
RecvACK();
Stop(); //发送停止命令
return 0;
}
在写入时会卡在发送起始信号这……while (!(I2CMSST & 0x40));
看到有的评论说IO要设成开漏,但我之前用过,也是设成准双向IO,可以使用,而且说明书中的例程也是设成的双向IO!
***芯片型号为STC8H1K08

没有发现结贴模式,问题已解决是硬件问题,两个IIC器件通信时用的软排线,FPC线连接,在焊接座子时有一根线,恰好是GND断开了,不知道是座子变形断开还是别的原因,引脚应该是焊接上的。是怎么发现的呢,是因为测量两块板的对地电压不一致,从机电压偏高,奇怪的是没有连接GND,从机的PW6513也能输出电压!还有一个原因,在测试PW6513时烧过后级芯片,因为输入电容没有直接接到PW6513的VCC脚上,导致烧了几个后级习片,此时也把从机的IO口烧了,所以是好多问题叠加出现了卡在启动信号发送问题这的!