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
我尝试使用附加的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