打印
[APM32F1]

基于APM32F10x库0xx库的软硬件iic

[复制链接]
2331|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-0xx.zip

2.28 KB

iic-10x.zip

1.88 KB

使用特权

评论回复
沙发
两只袜子| | 2022-11-2 15:23 | 只看该作者
是一个爱国的公司啊,支持国产芯片

使用特权

评论回复
板凳
Fanexs168| | 2022-11-2 15:26 | 只看该作者
点个赞

使用特权

评论回复
地板
bestwell| | 2023-2-4 17:49 | 只看该作者
代码国产化?是直接寄存器操作iic的吗?

使用特权

评论回复
5
wengh2016| | 2023-2-4 19:01 | 只看该作者
如何将硬件iic和dma结合起来?

使用特权

评论回复
6
10299823| | 2023-2-5 14:37 | 只看该作者
自己编写apm32的库代码吗?              

使用特权

评论回复
7
sagade| | 2023-2-5 22:25 | 只看该作者
bestwell 发表于 2023-2-4 17:49
代码国产化?是直接寄存器操作iic的吗?

应该是用极海的库,不用ST的库的意思吧

使用特权

评论回复
8
zerorobert| | 2023-2-7 21:01 | 只看该作者
感觉硬件iic坑好多,可能不会使用的原因。

使用特权

评论回复
9
eefas| | 2023-2-8 13:39 | 只看该作者
模拟iiic好移植,方便很多。              

使用特权

评论回复
10
juliestephen| | 2023-2-8 14:49 | 只看该作者
APM32F10x库的兼容性还是不错的。

使用特权

评论回复
11
xiaoyaodz| | 2023-2-8 15:09 | 只看该作者
这个库代码的应用兼容st的产品吗?

使用特权

评论回复
12
lzmm| | 2023-6-10 15:58 | 只看该作者
定义了软件IIC的启动、停止、发送数据和读取数据等基本函数了吗

使用特权

评论回复
13
jimmhu| | 2023-6-10 16:09 | 只看该作者
模拟IIC还是使用硬件IIC,哪个更好

使用特权

评论回复
14
sanfuzi| | 2023-6-10 16:15 | 只看该作者
在使用软件IIC时,需要在程序中编写IIC总线的读、写、启动和停止等基本函数,并根据实际需求调整时序等参数

使用特权

评论回复
15
abotomson| | 2023-6-10 16:29 | 只看该作者
主机如何确定IIC总线上的器件的地址?

使用特权

评论回复
16
qiufengsd| | 2023-6-10 16:41 | 只看该作者
可以选择使用硬件IIC或软件模拟IIC进行数据交换。

使用特权

评论回复
17
timfordlare| | 2023-6-10 16:50 | 只看该作者
软件模拟IIC则是通过单片机软件控制GPIO口的电平变化来模拟IIC时序,由于需要经过CPU处理,所以传输速率较慢,一般在400kHz以下。

使用特权

评论回复
18
hudi008| | 2023-6-10 16:58 | 只看该作者
硬件IIC是使用芯片内部的硬件模块实现的IIC通信,具有速度快、稳定性好、占用CPU资源低等优点。

使用特权

评论回复
19
yorkbarney| | 2023-6-10 17:35 | 只看该作者
硬件IIC通常能够达到几十MHz的传输速率,具有传输速度快且稳定等优点。

使用特权

评论回复
20
deliahouse887| | 2023-6-10 17:44 | 只看该作者
软件IIC相对于硬件IIC而言,速度较慢,容易受到干扰等因素的影响,但它可以灵活地控制时序,方便在多个设备之间进行通信。

使用特权

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

本版积分规则

15

主题

18

帖子

0

粉丝