搜索
bottom↓
回复: 9

求助 IIC总线器件子地址是什么意思啊

[复制链接]

出0入0汤圆

发表于 2013-7-17 10:44:08 | 显示全部楼层 |阅读模式
如头文件<IIC.H>中
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
   uchar i;

   Start_I2c();                  /*启动总线*/
   SendByte(sla);                /*发送器件地址*/
   if(ack==0)return(0);
   SendByte(suba);               /*发送器件子地址*/
   if(ack==0)return(0);
这个suba是什么啊?发送器件子地址。

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2013-7-17 10:46:34 | 显示全部楼层
是你要读写数据的地址。                                                                                                                        

出0入0汤圆

 楼主| 发表于 2013-7-17 10:51:42 | 显示全部楼层
.titrwh 发表于 2013-7-17 10:46
是你要读写数据的地址。                                                                               ...

谢谢兄弟指点,对于24C02共32页的芯片来说,比如第5页上的地址是怎么定义的啊,能示意下吗,谢谢啦。

出0入0汤圆

 楼主| 发表于 2013-7-17 11:38:57 | 显示全部楼层
先定义一个数组:
on_off_cnt[200];

ISendStr(0xa0,0x00,on_off_cnt,8);//把数据on_off_cnt[0]-on_off_cnt[7]-写到0x00-0X07地址中
delayms(10);
ISendStr(0xa0,0x08,&on_off_cnt[8],8);//把数据on_off_cnt[8]-on_off_cnt[15]-写到0x08-0X0f地址中
delayms(10);
ISendStr(0xa0,0x10,&on_off_cnt[16],8);//把数据on_off_cnt[16]-on_off_cnt[23]-写到0x10-0X17地址中
delayms(10);
ISendStr(0xa0,0x18,&on_off_cnt[24],8);//把数据on_off_cnt[24]-on_off_cnt[31]-写到0x18-0X1f地址中
.................................
.................................
delayms(10);
ISendStr(0xa0,0xc0,&on_off_cnt[192],8);//把数据on_off_cnt[192]-on_off_cnt[199]-写到0x08-0X0f地址中

以此类推,写25次就可以把200字节写完。

读取的话就按地址:
IRcvStr(0xa0,0x00,on_off_cnt,1);//从地址0x00-0X07中读出数据到on_off_cnt[0]-on_off_cnt[7]
delayms(10);
IRcvStr(0xa0,0x08,&on_off_cnt[8],1);//从地址0x08-0X0f中读出数据到on_off_cnt[8]-on_off_cnt[16]
................................
...............................
看到一位兄弟这么写的,24C0X这种芯片用起来不能自动分页吗,呵呵,这么麻烦。

出0入0汤圆

发表于 2013-7-17 12:38:46 | 显示全部楼层
用過24c02不需分頁

出0入0汤圆

发表于 2013-7-17 12:57:46 | 显示全部楼层
你要是看到ch452的官方给的I2c的程序,你会彻底崩溃的。
说是兼容I2c,原来只是兼容时序!

出0入30汤圆

发表于 2013-7-17 14:02:10 | 显示全部楼层
czg1411 发表于 2013-7-17 11:28
32 x 5 . . .


32页的话,每页就是8个字节,8*4
如16页的话,每页就是F个字节,F*4

出0入0汤圆

发表于 2013-7-17 17:43:10 | 显示全部楼层
#include <at89x52.h>

#define AT24_SCL_H       P2|=1<<0     //时钟线p2.0
#define AT24_SCL_L       P2&=~(1<<0)  
  
#define AT24_SDA_H       P2|=1<<1     //数据线p2.1
#define AT24_SDA_L       P2&=~(1<<1)
#define AT24_SDA_R       P2&(1<<1)

#define AT24C01                  1
#define AT24C02                  2
#define AT24C04                  3
#define AT24C08                  4
#define AT24C16                  5
#define AT24C32                  6
#define AT24C64                  7
#define AT24C128          8
#define AT24C256          9
#define AT24C512          10
#define AT24C1024          11

#define AT24_CHIP_TYPE  AT24C02     //型号

#if  AT24_CHIP_TYPE==AT24C01
#define at24_addr_byte   1          //地址字节长度      
#define at24_addr_type         unsigned char       
#define AT24_CHIP_PAGE   8        //每页大小
#define AT24_CHIP_MAX    0x7F   //最大地址
#elif AT24_CHIP_TYPE==AT24C02
#define at24_addr_byte   1          
#define at24_addr_type         unsigned char       
#define AT24_CHIP_PAGE   8
#define AT24_CHIP_MAX    0xFF
#elif AT24_CHIP_TYPE==AT24C04
#define at24_addr_byte   1
#define at24_addr_type         unsigned short       
#define AT24_CHIP_PAGE   16
#define AT24_CHIP_MAX    0x1FF
#elif AT24_CHIP_TYPE==AT24C08
#define at24_addr_byte   1
#define at24_addr_type         unsigned short       
#define AT24_CHIP_PAGE   16
#define AT24_CHIP_MAX    0x3FF
#elif AT24_CHIP_TYPE==AT24C16
#define at24_addr_byte   1
#define at24_addr_type         unsigned short       
#define AT24_CHIP_PAGE   16
#define AT24_CHIP_MAX    0x7FF
#elif AT24_CHIP_TYPE==AT24C32
#define at24_addr_byte   2
#define at24_addr_type         unsigned short       
#define AT24_CHIP_PAGE   32
#define AT24_CHIP_MAX    0xFFF
#elif AT24_CHIP_TYPE==AT24C64
#define at24_addr_byte   2
#define at24_addr_type         unsigned short       
#define AT24_CHIP_PAGE   32
#define AT24_CHIP_MAX    0x1FFF
#elif AT24_CHIP_TYPE==AT24C128
#define at24_addr_byte   2
#define at24_addr_type         unsigned short
#define AT24_CHIP_PAGE   64       
#define AT24_CHIP_MAX    0x3FFF
#elif AT24_CHIP_TYPE==AT24C256
#define at24_addr_byte   2
#define at24_addr_type         unsigned short       
#define AT24_CHIP_PAGE   64       
#define AT24_CHIP_MAX    0x7FFF
#elif AT24_CHIP_TYPE==AT24C512
#define at24_addr_byte   2
#define at24_addr_type         unsigned short       
#define AT24_CHIP_PAGE   128
#define AT24_CHIP_MAX    0xFFFF       
#elif AT24_CHIP_TYPE==AT24C1024
#define at24_addr_byte   2
#define at24_addr_type         unsigned long       
#define AT24_CHIP_PAGE   128
#define AT24_CHIP_MAX    0x1FFFF       
#else
#define at24_addr_byte   0
#define at24_addr_type         unsigned char       
#define AT24_CHIP_PAGE   0
#define AT24_CHIP_MAX    0xFF
#endif
#define AT24_CHIP_SIZE   (AT24_CHIP_MAX+1)  //容量(字节)


#if AT24_CHIP_TYPE==AT24C04 || AT24_CHIP_TYPE==AT24C08 || AT24_CHIP_TYPE==AT24C16 || AT24_CHIP_TYPE==AT24C1024
unsigned char at24_addr(unsigned char DeviceAddr,at24_addr_type WriteAddr)
{
#if  AT24_CHIP_TYPE==AT24C04
        unsigned char Axx=(*((char*)&WriteAddr+1))<<1;
        DeviceAddr|=Axx&0x02;       
#elif  AT24_CHIP_TYPE==AT24C08
        unsigned char Axx=(*((char*)&WriteAddr+1))<<1;
        DeviceAddr|=Axx&0x06;       
#elif  AT24_CHIP_TYPE==AT24C16
        unsigned char Axx=(*((char*)&WriteAddr+1))<<1;
        DeviceAddr|=Axx&0x0e;       
#elif  AT24_CHIP_TYPE==AT24C1024
        unsigned char Axx=(*((char*)&WriteAddr+2))<<1;
        DeviceAddr|=Axx&0x02;       
#else                                           
        WriteAddr=WriteAddr;
#endif
        return DeviceAddr;
}
#endif

void at24_delay(void)
{
        unsigned char i=10;                                                       
        while(i--)
        {             
        }
}

void delay1ms(unsigned char ms)
{
    unsigned char i,j;

        while(ms--)
        {
                    for(i=0;i<130;i++)
                      for(j=0;j<255;j++)
                      {
                        
                      }
          }
}

void at24_Start(void)
{        
        AT24_SDA_H;
        at24_delay();
        AT24_SCL_H;
        at24_delay();
        AT24_SDA_L;
        at24_delay();
        AT24_SCL_L;
        at24_delay();
}

void at24_Stop(void)
{            
        AT24_SDA_L;
        at24_delay();
        AT24_SCL_H;
        at24_delay();
        AT24_SDA_H;
        at24_delay();
}

void at24_Ack(void)
{                            
        AT24_SDA_L;
        at24_delay();
        AT24_SCL_H;
        at24_delay();
        AT24_SCL_L;
        at24_delay();
}

void at24_NoAck(void)
{       
        AT24_SDA_H;
        at24_delay();
        AT24_SCL_H;
        at24_delay();
        AT24_SCL_L;
        at24_delay();
}

int at24_WaitAck(void)        
{      
        AT24_SDA_H;                       
        at24_delay();
        AT24_SCL_H;
        at24_delay();   
        if(AT24_SDA_R)
        {
                AT24_SCL_L;
                at24_delay();
                return 0;
        }
        AT24_SCL_L;
        at24_delay();
        return 1;
}

void at24_WriteByte(unsigned char write_data)
{
    unsigned char i;

    for(i = 0; i < 8; i++)
    {                                               
                if(write_data&0x80)
                {
                        AT24_SDA_H;  
                }
                else
                {
                        AT24_SDA_L;   
                }
                write_data<<=1;
                at24_delay();
                AT24_SCL_H;
                at24_delay();
                AT24_SCL_L;
                at24_delay();
    }
}

unsigned char at24_ReadByte(void)  
{
    unsigned char i;
    unsigned char read_data=0;

    AT24_SDA_H;
    at24_delay();       
    for(i = 0; i < 8; i++)
    {         
                AT24_SCL_H;
                at24_delay();
                read_data<<=1;        
                if(AT24_SDA_R)
                {
                        read_data+=0x01;
                }
                AT24_SCL_L;
                at24_delay();
    }
    return read_data;
}


unsigned char at24_ByteRead(unsigned char DeviceAddr,at24_addr_type ReadAddr,unsigned char *pBuffer,at24_addr_type Length)
{
#if AT24_CHIP_TYPE==AT24C04 || AT24_CHIP_TYPE==AT24C08 || AT24_CHIP_TYPE==AT24C16 || AT24_CHIP_TYPE==AT24C1024
        DeviceAddr=at24_addr(DeviceAddr,ReadAddr);
#endif               
        if(at24_addr_byte>0)
        {
            at24_Start();
            at24_WriteByte(DeviceAddr&0xFE);
                if(at24_addr_byte>1)
                {       
                        if(at24_WaitAck())
                        {
                                at24_WriteByte(ReadAddr>>8);
                        }
                        else
                        {
                                at24_Stop();
                                return 0;
                        }
                }
                if(at24_addr_byte>0)
                {
                        if(at24_WaitAck())
                        {
                                at24_WriteByte(ReadAddr);               
                        }
                        else
                        {
                                at24_Stop();
                                return 0;
                        }       
                }
                at24_WaitAck();
        }
        at24_Start();
        at24_WriteByte(DeviceAddr|0x01);
        at24_WaitAck();
        while(Length--)
        {
                *pBuffer++=at24_ReadByte();
                if(Length)
                {
                        at24_Ack();
                }
                else
                {
                        at24_NoAck();
                }
        }
        at24_Stop();
        return 1;
}

unsigned char at24_ByteWrite(unsigned char DeviceAddr,at24_addr_type WriteAddr,unsigned char *pBuffer,at24_addr_type Length)
{
#if  AT24_CHIP_PAGE>0                  
    at24_addr_type i=WriteAddr;
    WRITE:  
#endif  
#if AT24_CHIP_TYPE==AT24C04 || AT24_CHIP_TYPE==AT24C08 || AT24_CHIP_TYPE==AT24C16 || AT24_CHIP_TYPE==AT24C1024
        DeviceAddr=at24_addr(DeviceAddr,WriteAddr);
#endif
    at24_Start();
    at24_WriteByte(DeviceAddr&0xFE);
        if(at24_addr_byte>1)
        {
                if(at24_WaitAck())
                {
                        at24_WriteByte(WriteAddr>>8);        
                }
                else
                {
                        at24_Stop();
                        return 0;
                }       
        }
        if(at24_addr_byte>0)
        {
                if(at24_WaitAck())
                {
                        at24_WriteByte(WriteAddr);
                }
                else
                {
                        at24_Stop();
                        return 0;
                }
        }
        at24_WaitAck();               
    while(Length--)
        {
                at24_WriteByte(*pBuffer++);
                at24_WaitAck();  
#if  AT24_CHIP_PAGE>0         
                if((++i%AT24_CHIP_PAGE)==0)
                {
                        if(Length>0)
                        {
                                at24_Stop();
                                delay1ms(5);
                                WriteAddr=i;
                                goto WRITE;
                        }
                }
#endif
        }
        at24_Stop();
        delay1ms(5);
        return 1;
}


void main(void)
{
        char buf_in[48];
        char buf_out[48];
        char i;

        for(i=0;i<48;i++)
        {
                buf_in[i]=i;
        }
   
        at24_ByteWrite(0xa0,AT24_CHIP_SIZE-48,buf_in,48);

        at24_ByteRead(0xa0,AT24_CHIP_SIZE-48,buf_out,48);

        while(1);
}

出145入215汤圆

发表于 2013-7-18 02:35:45 | 显示全部楼层
czg1411 发表于 2013-7-17 17:59
我看错了。每页8字节就是8*5。参考上面的程序。。。

8*5就是第6页的首地址

出145入215汤圆

发表于 2013-7-18 02:38:20 | 显示全部楼层
8楼的说的对

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 07:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表