应该是我水平低,搞不懂他怎么处理:
- // 发送开始命令 发送器件地址(写) 发送数据地址 发送开始命令 发送器件地址(读)读数据
- //头尾2个器件地址(第1个最后一位写0,第2个最后一位写1),数据片内地址只发1次
- void IIC_Read_NByte( u8 slave,u8 addr,u8 *p,u8 number ) //iic读取连续的几个字节
- {
- I2C_MasterStart(); //发送一个启动信号"S”,开始一次通信的开始
-
- //IIC_SENDBYTE(slave); //主机发送命令字。该字由 7 位的外围器件地址和 1 位读写控制位R/W组成(此时RW=1为读)
- //slave 由 7 位的外围器件地址和 1 位读写控制位R/W组成(此时RW=1为读)
- //IIC_WAITACK(); //等待从机应答ACK,结果由ask保存,为0就正确,为1就错误
- I2C_MasterSendByte(slave); //主机模式发送1字节数据,函数返回: 0 (接收的应答信号为ACK)
- //函数返回: 1 (接收的应答信号为NAK)
-
-
- //IIC_SENDBYTE(addr); //要写入芯片24C02的读取数据片内地址addr
- //IIC_WAITACK(); //等待从机应答ACK,结果由ask保存,为0就正确,为1就错误
-
- I2C_MasterStart(); //发送一个启动信号"S”,开始一次通信的开始
- I2C_MasterSendByte((u8)(slave+0x01)); //主器件发送器件地址(读/写选择位为"1"),主机模式发送1字节数据
- //函数返回: 0 (接收的应答信号为ACK)函数返回: 1 (接收的应答信号为NAK)
-
- //IIC_START();
- //IIC_SENDBYTE((u8)(slave+0x01)); //主器件发送器件地址(读/写选择位为"1")
- //IIC_WAITACK(); //芯片24C02应答ACK,并随时钟送出数据
-
-
- do
- {
- *p = I2C_MasterReadByte(BOOL ack); //第1圈P[0] 第2圈 P[1] 第3圈P[2]第4圈P[3]第5圈P[4]第6圈P[5].......
- p++;
- if( number!=1 ) //不是最后一位
- IIC_SENDACK(); //等待从机应答ACK,结果由ask保存,为0就正确,为1就错误,这句不写也OK
- }
- while(--number);
- IIC_SENDNACK();
- IIC_STOP(); //主机发送停止信号“P”
- }
复制代码 像这里:
do
{
*p = I2C_MasterReadByte(BOOL ack); //第1圈P[0] 第2圈 P[1] 第3圈P[2]第4圈P[3]第5圈P[4]第6圈P[5].......
p++;
if( number!=1 ) //不是最后一位
IIC_SENDACK(); //等待从机应答ACK,结果由ask保存,为0就正确,为1就错误,这句不写也OK
}
I2C_MasterReadByte(BOOL ack); 是读当前地址的1个字节数据,那么这个入口参数BOOL ack,我从哪里获取?
总不能直接带入0吧?
|