[APM32F1] 基于APM32F10x库0xx库的软硬件iic

[复制链接]
3555|23
 楼主| a976209770 发表于 2022-11-2 14:03 | 显示全部楼层 |阅读模式
由于最近公司要求国产化,需要将软件代码也国产化,项目后续使用APM的库进行开发,最近在使用apm库进行开发时发现库里在iic主里面只有写的例程,没有读的例程,参照其他库写了一个iic读的代码,供参考

uint8_t I2C_Read(uint8_t addr,uint32_t readsize,uint8_t data[],uint32_t len)
{
        int ret=0;
        if(readsize>len)
        {
                readsize=len;
        }
    uint16_t I2CTimeout = I2CT_LONG_TIMEOUT;

    while(I2C_ReadStatusFlag(I2C1, I2C_FLAG_BUSBSY))
    {
        I2C_Init();
        if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(4);
    }

    I2C_DisableInterrupt(I2C1, I2C_INT_EVT);
    /** Send START condition */
    I2C_EnableGenerateStart(I2C1);

    I2CTimeout = I2CT_FLAG_TIMEOUT;
    while(!I2C_ReadEventStatus(I2C1, I2C_EVENT_MASTER_MODE_SELECT))   //EV5
    {
        if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(5);
    }

    /** Send address for write */
    I2C_Tx7BitAddress(I2C1, addr, I2C_DIRECTION_TX);

    I2CTimeout = I2CT_FLAG_TIMEOUT;
    while(!I2C_ReadEventStatus(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))   //EV6
    {
        if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(6);
    }

    I2C_TxData(I2C1, addr);
                  I2CTimeout = I2CT_FLAG_TIMEOUT;
    while(!I2C_ReadEventStatus(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING))   //EV8
    {
        if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(6);
    }

I2C_EnableGenerateStart(I2C1);
        I2CTimeout = I2CT_LONG_TIMEOUT;
        while (!I2C_ReadEventStatus(I2C1, I2C_EVENT_MASTER_MODE_SELECT))   //EV5
        {
            if((I2CTimeout--) == 0)
            {
                return I2C_TIMEOUT_UserCallback(8);
            }
        }
                               
                               
      I2C_Tx7BitAddress(I2C1, addr, I2C_DIRECTION_RX);
                                 while (!I2C_ReadEventStatus(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))   //EV6
        {
            if((I2CTimeout--) == 0)
            {
                return I2C_TIMEOUT_UserCallback(8);
            }
        }
                while(ret<readsize)
        {
                if(ret==readsize-1)
                {
                        I2C_DisableAcknowledge(I2C1);
                        I2C_EnableGenerateStop(I2C1);
                }
                I2CTimeout = I2CT_FLAG_TIMEOUT;
                while(I2C_ReadEventStatus(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)==ERROR&&I2CTimeout--);
                if(I2CTimeout == 0)
                {
                        //        errno=6;
                                return -1;
                }
                data[ret++]=I2C_RxData(I2C1);
        }

           I2C_EnableAcknowledge(I2C1);
        return ret;
}
附件为基于APM10x以及APM0xx库的模拟iic代码,供参考。

iic-10x.zip

1.88 KB, 下载次数: 23

iic-0xx.zip

2.28 KB, 下载次数: 25

两只袜子 发表于 2022-11-2 15:23 来自手机 | 显示全部楼层
是一个爱国的公司啊,支持国产芯片
Fanexs168 发表于 2022-11-2 15:26 | 显示全部楼层
点个赞
bestwell 发表于 2023-2-4 17:49 | 显示全部楼层
代码国产化?是直接寄存器操作iic的吗?
wengh2016 发表于 2023-2-4 19:01 | 显示全部楼层
如何将硬件iic和dma结合起来?
10299823 发表于 2023-2-5 14:37 | 显示全部楼层
自己编写apm32的库代码吗?              
sagade 发表于 2023-2-5 22:25 | 显示全部楼层
bestwell 发表于 2023-2-4 17:49
代码国产化?是直接寄存器操作iic的吗?

应该是用极海的库,不用ST的库的意思吧
zerorobert 发表于 2023-2-7 21:01 | 显示全部楼层
感觉硬件iic坑好多,可能不会使用的原因。
eefas 发表于 2023-2-8 13:39 | 显示全部楼层
模拟iiic好移植,方便很多。              
juliestephen 发表于 2023-2-8 14:49 | 显示全部楼层
APM32F10x库的兼容性还是不错的。
xiaoyaodz 发表于 2023-2-8 15:09 | 显示全部楼层
这个库代码的应用兼容st的产品吗?
lzmm 发表于 2023-6-10 15:58 | 显示全部楼层
定义了软件IIC的启动、停止、发送数据和读取数据等基本函数了吗
jimmhu 发表于 2023-6-10 16:09 | 显示全部楼层
模拟IIC还是使用硬件IIC,哪个更好
sanfuzi 发表于 2023-6-10 16:15 | 显示全部楼层
在使用软件IIC时,需要在程序中编写IIC总线的读、写、启动和停止等基本函数,并根据实际需求调整时序等参数
abotomson 发表于 2023-6-10 16:29 | 显示全部楼层
主机如何确定IIC总线上的器件的地址?
qiufengsd 发表于 2023-6-10 16:41 | 显示全部楼层
可以选择使用硬件IIC或软件模拟IIC进行数据交换。
timfordlare 发表于 2023-6-10 16:50 | 显示全部楼层
软件模拟IIC则是通过单片机软件控制GPIO口的电平变化来模拟IIC时序,由于需要经过CPU处理,所以传输速率较慢,一般在400kHz以下。
hudi008 发表于 2023-6-10 16:58 | 显示全部楼层
硬件IIC是使用芯片内部的硬件模块实现的IIC通信,具有速度快、稳定性好、占用CPU资源低等优点。
yorkbarney 发表于 2023-6-10 17:35 | 显示全部楼层
硬件IIC通常能够达到几十MHz的传输速率,具有传输速度快且稳定等优点。
deliahouse887 发表于 2023-6-10 17:44 | 显示全部楼层
软件IIC相对于硬件IIC而言,速度较慢,容易受到干扰等因素的影响,但它可以灵活地控制时序,方便在多个设备之间进行通信。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

43

帖子

1

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