OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4084|回复: 5

关于战舰板子 IIC页写的问题

[复制链接]

29

主题

91

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2015-4-24
在线时间
37 小时
发表于 2016-3-11 17:55:18 | 显示全部楼层 |阅读模式
1金钱
我利用战舰的板子,并且使用原子的历程(我自己的没有通过)所以就全部使用的原子的底层,编写了一个IIC总线 页写的函数,不通过,求解答。代码如下:(我是自己按照AT24C02的手册页写的时序图写的)

//add,写入内存初始地址,
//len,写入数据长度(AT24C02正常页写只能写8个bit数据,超过之后,应该会出现覆盖)
//*p, 写入的数据
void IIC_Write_PageByt(u8 add,u8 len,u8 *p)  
{
       
        uint8_t i = 0;
        IIC_Start();   
        IIC_Send_Byte(0XA0);            
        IIC_Wait_Ack();
    IIC_Send_Byte(add);  
        IIC_Wait_Ack();            
        for(i=0;i<len;i++)
        {
                IIC_Send_Byte(*p++);
                IIC_Wait_Ack();
                delay_us(5);
        }
        delay_ms(5);
        IIC_Stop();  
}


目前出现的问题是,采用这样的页写函数,无法覆盖,写入多少个数据,就是多少个,超过8个之后,也会继续往下面的地址写。。

我自己在原子IIC实验的代码基础上,加了这个函数其他都没变,也不行-----求解答。





AZZXDMA5ESMH53O[6FQ708K.png
一起学,一起进步,未来总有你我的一片天空……
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-3-11 23:00:28 | 显示全部楼层
回复

使用道具 举报

29

主题

91

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2015-4-24
在线时间
37 小时
 楼主| 发表于 2016-3-12 13:16:36 | 显示全部楼层
有没有遇到过此种情况的,来帮忙看看
一起学,一起进步,未来总有你我的一片天空……
回复

使用道具 举报

29

主题

91

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2015-4-24
在线时间
37 小时
 楼主| 发表于 2016-3-12 13:21:00 | 显示全部楼层
@IC芯片去字笔 @xkwy 。。。宝贝们快来
一起学,一起进步,未来总有你我的一片天空……
回复

使用道具 举报

29

主题

91

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2015-4-24
在线时间
37 小时
 楼主| 发表于 2016-3-12 20:23:36 | 显示全部楼层
啊啊啊
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1837
金钱
1837
注册时间
2014-6-27
在线时间
981 小时
发表于 2016-3-12 20:28:04 | 显示全部楼层

/*********************************************************************
写数据,考虑跨页问题,只需要关心写入起始地址即可
返回:0,操作失败,1操作成功
*********************************************************************/
u8 AT24CXX_PageWrite(u16 WriteAddr, u8 *buf, u16 Len)
{
        u8 wr_page,wr_offset,x;
        wr_offset=I2C_PageSize-WriteAddr%I2C_PageSize;//起始地址所在的页还可以写入数据的个数
        if(Len>wr_offset)//需要跨页写,如果wr_offset为I2C_PageSize,刚好是一个页的开始
        {
                x=AT24CXX_WriteLenByte(WriteAddr, buf, wr_offset);//x=0,操作IIC失败,下面操作没必要了
                if(x)
                {
                        Len-=wr_offset;buf+=wr_offset;WriteAddr+=wr_offset;//重新定位
                        wr_page=Len/I2C_PageSize;//重新计算要写入的页数量
                        wr_offset=Len%I2C_PageSize;//重新计算页偏移量?
                        
                        while(wr_page)//写入整页数据
                        {
                                AT24CXX_WriteLenByte(WriteAddr, buf, I2C_PageSize);
                                buf+=I2C_PageSize;
                                WriteAddr+=I2C_PageSize;
                                wr_page--;
                                
                        }
                        if(wr_offset)//不够一页的数据
                        {
                                AT24CXX_WriteLenByte(WriteAddr, buf, wr_offset);
                        }
                                
                }
               
        }
        else//可以在当前起始地址所在的页写入
        {
                x=AT24CXX_WriteLenByte(WriteAddr, buf, Len);
        }
        return x;   
}
你试试,应该没有什么问题。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 16:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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