OpenEdv-开源电子网

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

RT1052 的 I2C 写入多个数据 错误

[复制链接]

10

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2017-7-13
在线时间
13 小时
发表于 2019-3-21 15:53:40 | 显示全部楼层 |阅读模式
1金钱
RT1052 的I2c 向24C02中写数据时错误。
1、使用例程写入多个数据没问题。
u8 AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{       
    u8 status=0;
    u8 writedata=0;

    writedata=DataToWrite;

    //ÅäÖÃI2C xfer½á11ìå
    at24cxx_xfer.slaveAddress=AT24C02_ADDR;     //é豸μØÖ·
    at24cxx_xfer.direction=kLPI2C_Write;        //D′èëêy¾Y
    at24cxx_xfer.subaddress=(u32)WriteAddr;     //òa¶áè¡μļÄ′æÆ÷μØÖ·
    at24cxx_xfer.subaddressSize=1;              //μØÖ·3¤¶èò»¸ö×Ö½ú
    at24cxx_xfer.data=&writedata;               //òaD′èëμÄêy¾Y
    at24cxx_xfer.dataSize=1;                    //D′èëêy¾Y3¤¶è1¸ö×Ö½ú
    at24cxx_xfer.flags=kLPI2C_TransferDefaultFlag;

    if(LPI2C_MasterTransferBlocking(LPI2C1,&at24cxx_xfer)==kStatus_Fail)
        status=1;

    delay_ms(6);      //AT24C02D′ÖüÆú×î′ó5ms£¬ËùòÔÕaàïòaóDÑóê±
    return status;         
}



//ÔúAT24CXXàïÃæμÄÖ¸¶¨μØÖ·¿aê¼D′èëÖ¸¶¨¸öêyμÄêy¾Y
//WriteAddr :¿aê¼D′èëμÄμØÖ· ¶Ô24c02Îa0~255
//pBuffer   :êy¾Yêy×éê×μØÖ·
//NumToWrite:òaD′èëêy¾Yμĸöêy
void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
{
        while(NumToWrite--)
        {
                AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
                WriteAddr++;
                pBuffer++;
        }
}


在实际使用中调用函数:AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite);  试验是没问题的。但是 函数AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite) 中有个10Ms的延时,这样造成1次写入多个数据时, 出现500ms的等待时间,造成使用体验不好。  所以我更改为这样:


u8 AT24CXX_WriteNumByte(u16 WriteAddr,u8 *DataToWrite,u8 len)
{       
    u8 status=0;
    u8 writedata=0;

//    writedata=DataToWrite;

    //ÅäÖÃI2C xfer½á11ìå
    at24cxx_xfer.slaveAddress=AT24C02_ADDR;     //é豸μØÖ·
    at24cxx_xfer.direction=kLPI2C_Write;        //D′èëêy¾Y
    at24cxx_xfer.subaddress=(u32)WriteAddr;     //òa¶áè¡μļÄ′æÆ÷μØÖ·
    at24cxx_xfer.subaddressSize=1;              //μØÖ·3¤¶èò»¸ö×Ö½ú
    at24cxx_xfer.data=DataToWrite;               //òaD′èëμÄêy¾Y
    at24cxx_xfer.dataSize=len;                    //D′èëêy¾Y3¤¶è1¸ö×Ö½ú
    at24cxx_xfer.flags=kLPI2C_TransferDefaultFlag;

    if(LPI2C_MasterTransferBlocking(LPI2C1,&at24cxx_xfer)==kStatus_Fail)
        status=1;

    delay_ms(10);      //AT24C02D′ÖüÆú×î′ó5ms£¬ËùòÔÕaàïòaóDÑóê±
    return status;         
               
}


但是发现写入数据不正确。 仿真时发现调用:LPI2C_MasterTransferBlocking(LPI2C1,&at24cxx_xfer)时,  运行不对。  
谁能帮忙看看是什么原因。
谢谢!






最佳答案

查看完整内容[请看2#楼]

此问题!已经解决!谢谢!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2017-7-13
在线时间
13 小时
 楼主| 发表于 2019-3-21 15:53:41 | 显示全部楼层
此问题!已经解决!谢谢!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-3-22 01:56:55 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 08:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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