用dsPIC33的IO口模拟IIC,与ISL12026通讯,
硬件连接:
RG12-----12026 SCL
RG13-----12026 SDA
调试时发现程序一直停在发送函数“Send_Data”的 while(PORTGbits.RG13);处,
也就是一直在等12026的ASK信号,但没有应答,SCL和SDA的上拉用的是1.2K电阻,没找到合适的,是不是小了?
程序参考了本站莫老的帖子“http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1733895&bbs_page_no=1&bbs_id=3020”
现在就是想请教各位老师我的程序的问题到底在哪了?
问题的起因:dsPIC33不带EEPROM,外部只剩RG12、13两脚,我以前用的DS1302存储空间太小,而且是SPI协议,
所以现在换了有4K EEPROM的ISL12026,就不会搞IIC了。
谢谢各位老师看到此帖后赐教,期盼您的回复。
我试验的程序如下:
// 地址 R/W
// EEPROM->1010 | |
// 111 0
// RTC ->1101
#define RTC_White_Addr 0xde
#define RTC_Read_Addr 0xdf
#define EEPROM_White_Addr 0x6e
#define EEPROM_Read_Addr 0x6f
#define Clock_SCL LATGbits.LATG12
#define Clock_SDA LATGbits.LATG13
void I2C_Start (void) //IIC开始
{
TRISGbits.TRISG12=0; //SCL置输出
TRISGbits.TRISG13=0; //SDA输出
Clock_SDA=1;
asm("nop");
Clock_SCL=1;
Delay(8);
Clock_SDA=0;
Delay(8);
Clock_SCL=0;
Delay(8);
}
void I2C_Stop(void) //iic结束
{
Clock_SDA=0;
Delay(8);
Clock_SCL=1;
Delay(8);
Clock_SDA=1;
Delay(8);
TRISGbits.TRISG12=1; //释放IIC线
TRISGbits.TRISG13=1;
}
void Send_Data (unsigned char Data)
{ unsigned char loop;
for(loop=8;loop>0;loop--)//送器件寻址地址
{
Clock_SDA = Data & 0x1;
Clock_SCL = 1;
Data = Data>>1;
Delay(8);//asm("nop");
Clock_SCL = 0;
Delay(8);
}
TRISGbits.TRISG13 = 1; //SDA脚置为输入
asm("nop");
while(PORTGbits.RG13);//等待SDA为0,即ACK为0
TRISGbits.TRISG13 = 0; //SDA脚置为输出
asm("nop");
}
void Clock_I2C_RTC_ByteWrite(unsigned char Data, unsigned int WriteAddr) // 时钟数据字节写
{
unsigned char Addr_H,Addr_L;
Addr_L = WriteAddr & 0x00ff; //低8位地址
Addr_H = WriteAddr >> 8; //高8位地址
I2C_Start();// IIC开始
// Clock_SCL = 0; //时钟线拉低
Send_Data(RTC_White_Addr);//送器件寻址地址
Send_Data(Addr_H);//送目标地址H
Send_Data(Addr_L);//送目标地址L
Send_Data(Data);//送数据
I2C_Stop(); //IIC结束
}
unsigned char Clock_I2C_RTC_RandomRead(unsigned int ReadAddr) //时钟数据随机读
{
unsigned Addr_H,Addr_L,Data;
Addr_L = ReadAddr & 0x00ff; //低8位地址
Addr_H = ReadAddr>> 8; //高8位地址
Clock_I2C_RTC_ByteWrite(0x02,0x003F); //进入时钟 这两个指令必须加,不然时钟始终读写不成功
Clock_I2C_RTC_ByteWrite(0x06,0x003F);
I2C_Start();// IIC开始
Send_Data(RTC_White_Addr);//送RTC写寻址地址
Send_Data(Addr_H);//送目标地址H
Send_Data(Addr_L);//送目标地址L
I2C_Start();// IIC再开始
Send_Data(RTC_Read_Addr);//送RTC读寻址地址
Data = Receive_Data();//读数据
I2C_Stop(); //IIC结束
return Data;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
// EEPROM->1010 | |
// 111 0 (1:读 0:写)
// RTC ->1101
现在已经能够通讯了,可以随机读出CCR的状态,比如电池供电时SR的状态是0X80,这是对的,还有PWR的内容是0x40,这也是对的
但是,现在的问题是:
1、随机读出的时间是两秒跳一次,即秒按0、2、4、6、8、10...56、58、00这样变化,
用if(读出的数 % 2)验证读出的数确实全是偶数,但时间变化的速度是对的,
2、时间值是BCD码的,存的时候将十进制转成BCD,读出来在反向转换,但读出的
数都不对,
3、不知道莫老师的贴子“http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1733895&bbs_page_no=1&search_mode=4&search_text=fangjikun&bbs_id=9999”
里的“ RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); //原程序没有整个语句,不给时钟怎么干活呢。 ”
是怎么个意思??
4、EEPROM页写的是9,随机读出再显示却是8
5、电池供电时不能读EEPROM的内容吗?读出是0,
望高手指点!!1
ourdev_698269TVQ642.txt(文件大小:8K) (原文件名:iic.txt)
一周热门 更多>