变形和I2C

N

neuralc

Guest
大家好,

我尝试使用附加的I2C C源文件。

模拟与16f876a和fm24c16变形,和磨片我送一个字节(使用SendI2C)在StartI2C()的特殊教育需要设置为1,这应该esltimul硬件生成一个启动条件(SDA的应该低),但问题SDA的是不低
, 既没有去设置
, 我再次得到一个无限循环SSPIF ...

有些人能够帮助??

ThX

NeuralC

/************************************************* *****************************
*头文件的I2C
*
*此文件包含的I2C程序定义的函数原型
*在I2C.C.
************************************************** ****************************
* /

#ifndef _I2C_H
#定义_I2C_H/ /函数原型

字符SendI2C(字符,字符,字符*);
字符GetI2C(字符,字符,字符,字符*);
字符StartI2C(字符);
字符ReStartI2C(字符);
无效StopI2C(无效);#endif/************************************************* *****************************
*的I2C例程(2002年11月9日)
*
*此文件包含的I2C例程。
*每个例程的参数解释上述函数声明。
************************************************** ****************************
* /

#ifndef _I2C_C
#定义_I2C_C

#包括“i2c.h”/************************************************* *****************************
* SendI2C
* I2CADD:从设备的I2C地址左移1位
* I2CBYTES:字节数派遣I2CBUFFER
* I2CBUFFER:指向一个字符串缓冲区包含字节发送
*
*此子程序转移I2CBYTES从字符串数据字节指出
,*由I2CBUFFER到从设备的地址I2CADD。
*
*返回1:发送成功完成
* 0:发送失败
************************************************** ****************************
* /

字符SendI2C(字符I2CADD,烧焦I2CBYTES,烧焦* I2CBUFFER)

字符计数= 0;
字符bSUCCESS = 1; / /假设成功转让

如果(StartI2C(I2CADD&0xFE))/ /开始转移
, 并说明写

而(计数“I2CBYTES)/ /循环
, 直到所有已发送字节

SSPIF = 0; / /清除中断标志
SSPBUF = I2CBUFFER [流量 ]; / /发送字节

而(SSPIF == 0); / /等待直到发送字节

其他)
bSUCCESS = 0; / /指明发送失败

StopI2C(); / /停止转让

返回bSUCCESS; / /返回成功与否的指标


/************************************************* *****************************
* GetI2C
* I2CADD:从设备的I2C地址左移1位
* I2CCOMMAND:“0表示接受指挥,在指挥的第一个字节
* I2CBUFFER
* = 0表示正常接收
* I2CBYTES:字节数
, 以获得设备和写入I2CBUFFER
* I2CBUFFER:指向一个字符串缓冲区,读取的字节将存储在这里
*
*此子程序转移I2CBYTES从从设备的数据字节
*地址I2CADD和I2CBUFFER它们存储。如果收到的指挥
*由I2CCOMMAND,在I2CBUFFER第一个字节表示写入
*在读取任何数据从设备。
*
*返回1:取得成功
* 0:获取失败
************************************************** ****************************
* /

字符GetI2C(字符I2CADD,烧焦I2CCOMMAND,烧焦I2CBYTES,烧焦* I2CBUFFER)

字符计数= 0;
字符bSUCCESS;

如果(I2CCOMMAND)

bSUCCESS = StartI2C(I2CADD&0xFE); / /开始转移
, 并说明写

SSPIF = 0; / /清除中断标志
SSPBUF = I2CBUFFER [0]; / /发送命令字节

而(SSPIF == 0); / /等待直到发送字节

ReStartI2C(I2CADD | 0x01)后; / /重新启动并注明转读
其他)
bSUCCESS = StartI2C(I2CADD | 0x01)后; / /开始转移并注明读

而(计数“I2CBYTES)

SSPIF = 0; / /清除中断标志
RCEN = 1; / /初始化读操作

而(SSPIF == 0);

I2CBUFFER [流量 ] = SSPBUF; / /存储在缓冲区字节
SSPIF = 0; / /清除中断标志

如果(计数== I2CBYTES)/ /如果我们读过所有字节
ACKDT = 1; / /表明我们所做的没有ACK
其他的
ACKDT = 0; / /否则承认字节

阿肯= 1; / /开始确认序列

而(SSPIF == 0); / /等待
, 直到确认完成


StopI2C(); / /停止转让

返回bSUCCESS; / /返回成功与否的指标


/************************************************* *****************************
* StartI2C
* I2CADD:从设备的I2C地址(左转向由1位) R / W位
*
*此子程序通过发送一个启动条件和一个I2C转移
*从设备的地址,I2CADD。
*
*返回1:从站设备
, 承认
* 0:从站设备
, 不承认
************************************************** ****************************
* /

字符StartI2C(字符I2CADD)

SSPIF = 0; / /清除中断标志
特殊教育= 1; / /初始化开始条件

而(SSPIF == 0); / /等待直到完成起始条件

SSPIF = 0; / /清除中断标志
SSPBUF = I2CADD; / /发送装置的从属地址

而(SSPIF == 0); / /等待
, 直到报告已发送

如果(ACKSTAT == 0)
返回1; / /返回1,如果设备确认
其他的
返回0; / /返回0,如果设备不承认


/************************************************* *****************************
* ReStartI2C
* I2CADD:从设备的I2C地址(左转向由1位) R / W位
*
*此子程序发送重新启动条件
, 从设备的地址
* I2CADD。
*
*返回1:从站设备
, 承认
* 0:从站设备
, 不承认
************************************************** ****************************
* /

字符ReStartI2C(字符I2CADD)

SSPIF = 0;
RSEN = 1; / /初始化启动条件

而(SSPIF == 0); / /等待
, 直到开始条件完成

SSPIF = 0; / /清除中断标志
SSPBUF = I2CADD; / /发送装置的从属地址

而(SSPIF == 0); / /等待
, 直到报告已发送

如果(ACKSTAT == 0)
返回1; / /返回1,如果设备确认
其他的
返回0; / /返回0,如果设备不承认


/************************************************* *****************************
* StopI2C
*
*此子程序结束
, 派出一个I2C停止条件转让。
************************************************** ****************************
* /

无效StopI2C(无效)

SSPIF = 0; / /清除中断标志
笔= 1; / /发送停止条件

而(SSPIF == 0); / /等待
, 直到完全停止条件
)#endif

 
我不分析deap您的代码
, 但在确定总体接缝。你提出的上SDA和SCL线的上拉电阻?
使用变形日志以查看是否正在接收EEPROM的启动和停止条件。我会尽力看你的代码在夜间更好。

 
HUPS ...:!!!!
读更好旗下PIC16模型的帮助下,我认为:

不为蓝本的I2C -分配给SSPCON2值只存储。
不为蓝本的I2C -分配给SSPADD值只存储。
不为蓝本的I2C -在SSPCON2只返回当前值读取。
不为蓝本的I2C -只读的SSPADD返回当前值。

PIC的模式并不模型的安全管理服务供应的I2C模式。
书面形式向SSPCON2或SSPADD寄存器只存储在寄存器的书面价值
, 而且不鼓动任何其他行动。
读寄存器返回它们的初始值或最后写信给他们的价值。
苏解释.....

SDA的,沙田至中环线,有停下来,thx Elavionic

ThX

NeuralC

 
喜的朋友1已在变形更好的例子如何接口峰见示例文件12C条的规定,虽然你摆脱由pic16dll阅读问题
帮助文件

 

Welcome to EDABoard.com

Sponsor

Back
Top