IIC协议

[复制链接]
2480|25
 楼主| M小涛 发表于 2016-9-8 10:35 | 显示全部楼层 |阅读模式
请问为什么只有0x06,0x02,0x04三个寄存器不能进行写操作。求指点迷津!
程序如下:
#include "IIC_Master.h"

static void delay()
{
    delay_us(10);
}

void IIC_Init(void)
{
    BIT_OUT(IIC_SDA);
    BIT_OUT(IIC_SCL);
    SET_BIT(IIC_SDA);
    SET_BIT(IIC_SCL);   
}

void IIC_Start(void)
{
    SET_BIT(IIC_SCL);
    delay();
    CLR_BIT(IIC_SDA);
    delay();
}

void IIC_Stop(void)
{
    CLR_BIT(IIC_SDA);
    delay();
    SET_BIT(IIC_SCL);
    delay();
    SET_BIT(IIC_SDA);
    delay();
}

void IIC_WriteByte(INT8U data)
{
    CLR_BIT(IIC_SCL);
    delay();
    for(int i = 0; i < 8; ++i)
    {
      if(data & 0x80)
      {
        SET_BIT(IIC_SDA);
      }
      else
      {
        CLR_BIT(IIC_SDA);
      }
      data = data << 1;
      delay();
      SET_BIT(IIC_SCL);
      delay();
      CLR_BIT(IIC_SCL);
      delay();
    }
}

INT8U IIC_ReadByte(void)
{
    INT8U data=0;
    CLR_BIT(IIC_SCL);
    BIT_IN(IIC_SDA);
    delay();
    for(int i = 0; i < 8; ++i)
    {
        data = data << 1;
        SET_BIT(IIC_SCL);
        delay();
        if(TEST_BIT(IIC_SDA))
        {
            data |= 0x01;
        }     
        CLR_BIT(IIC_SCL);
        delay();
    }
    BIT_OUT(IIC_SDA);
    return data;   
}

INT8U IIC_ReadAck()
{
    INT8U ACK=0;
    CLR_BIT(IIC_SCL);
    BIT_IN(IIC_SDA);
    delay();
    SET_BIT(IIC_SCL);
    delay();

    ACK = TEST_BIT(IIC_SDA);

    CLR_BIT(IIC_SCL);
    delay();
    BIT_OUT(IIC_SDA);
    return ACK;        
}

void IIC_SendAck(INT8U ACK)
{
    CLR_BIT(IIC_SCL);
    delay();
    if(ACK)
    {
        SET_BIT(IIC_SDA);
    }
    else
    {
        CLR_BIT(IIC_SDA);
    }
    delay();   
    SET_BIT(IIC_SCL);
    delay();   
    CLR_BIT(IIC_SCL);
    delay();      
}

INT8U IIC_WriteOneByteRegister(INT8U DeviceAddr,
                               INT8U RegisterAddr,
                               INT8U RegisterData)
{
    INT8U ACK=0;
    IIC_Start();
    IIC_WriteByte(DeviceAddr << 1);   //设备地址
    ACK += IIC_ReadAck();                 

    IIC_WriteByte(RegisterAddr);     //寄存器地址
    ACK += IIC_ReadAck();

    IIC_WriteByte(RegisterData);
    ACK += IIC_ReadAck();
    IIC_Stop();
    return ACK;      
}

INT8U IIC_ReadOneByteRegister(INT8U DeviceAddr,INT8U RegisterAddr)
{
    INT8U data=0;
    INT8U ACK=0;
    INT8U Addr=DeviceAddr << 1;

    IIC_Start();
    IIC_WriteByte(Addr);
    ACK += IIC_ReadAck();

    IIC_WriteByte(RegisterAddr);
    ACK += IIC_ReadAck();

    IIC_Start();
    IIC_WriteByte(Addr + 1);
    ACK += IIC_ReadAck();

    data = IIC_ReadByte();
    IIC_SendAck(IIC_NACK);

    IIC_Stop();
    return data;   
}

void IIC_ReadMulByteRegister(INT8U DeviceAddr,INT8U RegisterAddr,INT8U * Reg_data)  //读取FIFO寄存器中的数据
{
    INT8U m,n,i,l,ACK=0;
    INT8U Addr=DeviceAddr << 1;

    m=IIC_ReadOneByteRegister(0x57,0x02);  //读取写指针  
    n=IIC_ReadOneByteRegister(0x57,0x04);  //读取读指针

    IIC_Start();
    IIC_WriteByte(Addr);
    ACK += IIC_ReadAck();

    IIC_WriteByte(RegisterAddr);
    ACK += IIC_ReadAck();

    IIC_Start();
    IIC_WriteByte(Addr + 1);
    ACK += IIC_ReadAck();

   for(l=0;l<m-n;l++)
   {
   for(i=0;i<4;i++)
     {
       Reg_data[i] = IIC_ReadByte();
       if(i==3)
         IIC_SendAck(IIC_NACK);
       else
         IIC_SendAck(IIC_ACK);
      }
   }
    IIC_Stop();
    IIC_Start(); //重新写入读指针
    IIC_WriteByte(Addr + 1);
    IIC_WriteByte(0x04);
    IIC_WriteByte(0x00);
    IIC_Stop();
}


 楼主| M小涛 发表于 2016-9-8 10:37 | 显示全部楼层
其他寄存器是可以正常进行读写操作
dirtwillfly 发表于 2016-9-8 14:30 | 显示全部楼层
这是什么器件的iic通讯?不懂你说的那三个寄存器地址是干嘛用的。
myiclife 发表于 2016-9-8 16:26 | 显示全部楼层
不能正常读写?
myiclife 发表于 2016-9-8 16:31 | 显示全部楼层
这个是保护的寄存器吗?
 楼主| M小涛 发表于 2016-9-19 10:49 | 显示全部楼层
dirtwillfly 发表于 2016-9-8 14:30
这是什么器件的iic通讯?不懂你说的那三个寄存器地址是干嘛用的。

这是MAX30100的一个简单的IIC协议,想通过这个协议控制MAX30100,0X06是配置寄存器,0x02和0x04是FIFO寄存器的读指针和写指针寄存器。
 楼主| M小涛 发表于 2016-9-19 10:50 | 显示全部楼层
myiclife 发表于 2016-9-8 16:26
不能正常读写?

嗯,不知道为什么,每次读的都是0xef,初始值应该的0x00,谢谢
 楼主| M小涛 发表于 2016-9-19 10:51 | 显示全部楼层
myiclife 发表于 2016-9-8 16:31
这个是保护的寄存器吗?

都是可以读写的寄存器,不是保护的寄存器
 楼主| M小涛 发表于 2016-9-19 10:51 | 显示全部楼层
希望大神帮帮忙
 楼主| M小涛 发表于 2016-9-19 15:10 | 显示全部楼层
typeof 发表于 2016-9-19 22:28 | 显示全部楼层
你这是用的什么芯片?
typeof 发表于 2016-9-19 22:29 | 显示全部楼层
是不是这个寄存器不存在数据呢
 楼主| M小涛 发表于 2016-9-20 08:45 | 显示全部楼层
typeof 发表于 2016-9-19 22:28
你这是用的什么芯片?

MAX30100
 楼主| M小涛 发表于 2016-9-20 08:46 | 显示全部楼层
typeof 发表于 2016-9-19 22:29
是不是这个寄存器不存在数据呢

这是一个可读可写的寄存器,初始值为0x00,但不知道为什么读出来却是0xfe
Stannis 发表于 2016-9-20 20:30 | 显示全部楼层
读写这几个寄存器用不用在其他寄存器使能呢
 楼主| M小涛 发表于 2016-9-21 10:44 | 显示全部楼层
Stannis 发表于 2016-9-20 20:30
读写这几个寄存器用不用在其他寄存器使能呢

0x06是配置寄存器,应该没有影响
dirtwillfly 发表于 2016-9-29 21:55 | 显示全部楼层
M小涛 发表于 2016-9-19 10:49
这是MAX30100的一个简单的IIC协议,想通过这个协议控制MAX30100,0X06是配置寄存器,0x02和0x04是FIFO寄存 ...

没用过这个器件,建议咨询下厂家
wwppd 发表于 2016-9-29 23:11 | 显示全部楼层
寄存器是什么数据?
wwppd 发表于 2016-9-29 23:12 | 显示全部楼层
IIC的协议是不是地址不一样吗?
Rollo 发表于 2016-9-30 20:14 | 显示全部楼层
IIC时序

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

27

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部