打印
[PIC®/AVR®/dsPIC®产品]

如何调用I2C总线读写函数

[复制链接]
1164|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhanghqi|  楼主 | 2023-2-17 22:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的单片机是dsPIC33EP512GM310,使用MPLAB Code configurator 配置生成了I2C读写函数。但我不会调用它,请各位大神指导,谢谢!
我想向24C64中的0-7存储单元写入W[8] 8个字节数据。然后读出24C64中的0-7存储单元中的数据到R[8] 中来。24C64的芯片地址是0xA0。
我该如何调用下面的函数?

使用特权

评论回复
沙发
zhanghqi|  楼主 | 2023-2-17 22:13 | 只看该作者
下面是I2C的函数说明。我用的是第二个I2C。
void I2C2_Initialize(void);

void I2C2_MasterWrite(
                                uint8_t *pdata,
                                uint8_t length,
                                uint16_t address,
                                I2C2_MESSAGE_STATUS *pstatus);

void I2C2_MasterRead(
                                uint8_t *pdata,
                                uint8_t length,
                                uint16_t address,
                                I2C2_MESSAGE_STATUS *pstatus);

void I2C2_MasterTRBInsert(
                                uint8_t count,
                                I2C2_TRANSACTION_REQUEST_BLOCK *ptrb_list,
                                I2C2_MESSAGE_STATUS *pflag);

void I2C2_MasterReadTRBBuild(
                                I2C2_TRANSACTION_REQUEST_BLOCK *ptrb,
                                uint8_t *pdata,
                                uint8_t length,
                                uint16_t address);                              

void I2C2_MasterWriteTRBBuild(
                                I2C2_TRANSACTION_REQUEST_BLOCK *ptrb,
                                uint8_t *pdata,
                                uint8_t length,
                                uint16_t address);                           

bool I2C2_MasterQueueIsEmpty(void);                              
bool I2C2_MasterQueueIsFull(void);      

使用特权

评论回复
板凳
happy_10| | 2023-2-17 22:15 | 只看该作者
遇到过这个问题,想用MCC偷懒,一次成功就没什么问题,一次不成功就要从头开始找,到最后和自己看着数据手册手写的一样了

使用特权

评论回复
地板
liliang9554| | 2023-2-17 22:16 | 只看该作者
你发的都是MCC产生的代码,关键要看你是怎么调用的。

使用特权

评论回复
5
jiajs| | 2023-2-17 22:17 | 只看该作者
其实蛮简单,比如说你要用I2C2_MasterWrite这个函数,你可以直接搜索一下这个函数,一般MCC会生成.c和.h的2个关联文件

使用特权

评论回复
6
heweibig| | 2023-2-17 22:18 | 只看该作者
我印象中是在.h里面就有如何调用这个函数的例子.

使用特权

评论回复
7
wuhany| | 2023-2-17 22:28 | 只看该作者
你照葫芦画瓢地调用就可以了..

使用特权

评论回复
8
jiahy| | 2023-2-17 22:30 | 只看该作者
楼主调用成功了么?我使用PIC18F47Q10核心板,通过MCC开通I2C通讯,也是找不到示例

使用特权

评论回复
9
lizye| | 2023-2-17 22:31 | 只看该作者
按照头文件的函数说明自己写了读写操作函数,但测试未通过。

使用特权

评论回复
10
shimx| | 2023-2-17 22:31 | 只看该作者
void device_write(uint8_t *data,uint8_t length,uint16_t address)
{
    uint8_t timeOut = 0;
    I2C_MESSAGE_STATUS status;
    while(status != I2C_MESSAGE_FAIL)
    {
        I2C_MasterWrite(data,length,address,&status);
        while(status == I2C_MESSAGE_PENDING);
        if (status == I2C_MESSAGE_COMPLETE)
            break;
        if (timeOut == 100)
            break;
        else
            timeOut++;
    }
}
void device_read(uint8_t *data, uint8_t length, uint16_t address)
{      
    I2C_MESSAGE_STATUS status;
    if (status == I2C_MESSAGE_COMPLETE)
    {
        uint8_t timeOut = 0;
        while(status != I2C_MESSAGE_FAIL)
        {
            I2C_MasterRead(data,length,address,& status);
            while(status == I2C_MESSAGE_PENDING);
            if (status == I2C_MESSAGE_COMPLETE)
                break;
            if (timeOut == 100)
                break;
            else
                timeOut++;        
        }
    }
}
两个子程序,一个写,一个读,其实MCC的I2C.H文件有注释。

使用特权

评论回复
11
jiaxw| | 2023-2-17 22:33 | 只看该作者
PIC18F47Q10核心板,也是I2C通讯,开始用代码模拟I2C,但在SDA转换IO方向时却不知如何处理,后来开通I2C,自己尝试写了读写代码,但在测试时却通不过

使用特权

评论回复
12
spark周| | 2023-2-17 22:36 | 只看该作者
逻辑分析仪也看不了引脚的电平变化。

使用特权

评论回复
13
1988020566| | 2023-3-2 15:59 | 只看该作者
模拟i2c总线怎么实现一主多从?

使用特权

评论回复
14
tpgf| | 2023-3-3 11:38 | 只看该作者
这个 iic有自己的现成的读写函数 直接调用函数就行

使用特权

评论回复
15
qcliu| | 2023-3-3 11:54 | 只看该作者
jiaxw 发表于 2023-2-17 22:33
PIC18F47Q10核心板,也是I2C通讯,开始用代码模拟I2C,但在SDA转换IO方向时却不知如何处理,后来开通I2C, ...

为什么在中间过程 要将SDA转换方向呢

使用特权

评论回复
16
drer| | 2023-3-3 12:04 | 只看该作者
jiaxw 发表于 2023-2-17 22:33
PIC18F47Q10核心板,也是I2C通讯,开始用代码模拟I2C,但在SDA转换IO方向时却不知如何处理,后来开通I2C, ...

其实全程可以模拟iic啊 就通过高低电平来判定

使用特权

评论回复
17
coshi| | 2023-3-3 12:16 | 只看该作者
不需要专门的调用吧 只要简单地模拟时序就行

使用特权

评论回复
18
kxsi| | 2023-3-3 13:09 | 只看该作者
可以参考任意型号单片机中iic的代码  基本上都大同小异

使用特权

评论回复
19
wiba| | 2023-3-3 13:22 | 只看该作者
jiaxw 发表于 2023-2-17 22:33
PIC18F47Q10核心板,也是I2C通讯,开始用代码模拟I2C,但在SDA转换IO方向时却不知如何处理,后来开通I2C, ...

不需要在额外转换方向了  就是外部要加上上拉电阻  然后使用输入输出模式应该就可以啊

使用特权

评论回复
20
everyrobin| | 2023-3-3 21:19 | 只看该作者
单片机自带i2c总线吗               

使用特权

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

本版积分规则

852

主题

11757

帖子

5

粉丝