打印

IIC协议

[复制链接]
2115|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
请问为什么只有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 | 只看该作者
不能正常读写?

使用特权

评论回复
5
myiclife| | 2016-9-8 16:31 | 只看该作者
这个是保护的寄存器吗?

使用特权

评论回复
6
M小涛|  楼主 | 2016-9-19 10:49 | 只看该作者
dirtwillfly 发表于 2016-9-8 14:30
这是什么器件的iic通讯?不懂你说的那三个寄存器地址是干嘛用的。

这是MAX30100的一个简单的IIC协议,想通过这个协议控制MAX30100,0X06是配置寄存器,0x02和0x04是FIFO寄存器的读指针和写指针寄存器。

使用特权

评论回复
7
M小涛|  楼主 | 2016-9-19 10:50 | 只看该作者
myiclife 发表于 2016-9-8 16:26
不能正常读写?

嗯,不知道为什么,每次读的都是0xef,初始值应该的0x00,谢谢

使用特权

评论回复
8
M小涛|  楼主 | 2016-9-19 10:51 | 只看该作者
myiclife 发表于 2016-9-8 16:31
这个是保护的寄存器吗?

都是可以读写的寄存器,不是保护的寄存器

使用特权

评论回复
9
M小涛|  楼主 | 2016-9-19 10:51 | 只看该作者
希望大神帮帮忙

使用特权

评论回复
10
M小涛|  楼主 | 2016-9-19 15:10 | 只看该作者

使用特权

评论回复
11
typeof| | 2016-9-19 22:28 | 只看该作者
你这是用的什么芯片?

使用特权

评论回复
12
typeof| | 2016-9-19 22:29 | 只看该作者
是不是这个寄存器不存在数据呢

使用特权

评论回复
13
M小涛|  楼主 | 2016-9-20 08:45 | 只看该作者
typeof 发表于 2016-9-19 22:28
你这是用的什么芯片?

MAX30100

使用特权

评论回复
14
M小涛|  楼主 | 2016-9-20 08:46 | 只看该作者
typeof 发表于 2016-9-19 22:29
是不是这个寄存器不存在数据呢

这是一个可读可写的寄存器,初始值为0x00,但不知道为什么读出来却是0xfe

使用特权

评论回复
15
Stannis| | 2016-9-20 20:30 | 只看该作者
读写这几个寄存器用不用在其他寄存器使能呢

使用特权

评论回复
16
M小涛|  楼主 | 2016-9-21 10:44 | 只看该作者
Stannis 发表于 2016-9-20 20:30
读写这几个寄存器用不用在其他寄存器使能呢

0x06是配置寄存器,应该没有影响

使用特权

评论回复
17
dirtwillfly| | 2016-9-29 21:55 | 只看该作者
M小涛 发表于 2016-9-19 10:49
这是MAX30100的一个简单的IIC协议,想通过这个协议控制MAX30100,0X06是配置寄存器,0x02和0x04是FIFO寄存 ...

没用过这个器件,建议咨询下厂家

使用特权

评论回复
18
wwppd| | 2016-9-29 23:11 | 只看该作者
寄存器是什么数据?

使用特权

评论回复
19
wwppd| | 2016-9-29 23:12 | 只看该作者
IIC的协议是不是地址不一样吗?

使用特权

评论回复
20
Rollo| | 2016-9-30 20:14 | 只看该作者
IIC时序

2011032211314822.gif (53.75 KB )

2011032211314822.gif

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

27

帖子

0

粉丝