Linux学习之i-mx287学习:ARM9与GD32F407的I2C通信(ioctl,write,read)

2023-12-06 08:40

本文主要是介绍Linux学习之i-mx287学习:ARM9与GD32F407的I2C通信(ioctl,write,read),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        最近想试一下ARM9下的I2C设备与外挂MCU通信,外挂mcu用的是GD32F407,在把GD32F4的I2C0初始化成从中断接收模式后,ARM9的i2c读写遇到了一点问题,mcu始终没有进接收中断,在搜索问题解决方法时了解到linux下的I2C设备操作的一些经验,在这里记录一下。

一、linux下I2C设备的设置

i2c通信无非是模式设置、设备地址设置、速率设置,linux下的i2c设备设置操作给出了标准,需要使用ioctl这个函数进行设置,下面就I-MAX287A的ARM板中给的I2C读写例程来进行分析。

/*i2c_test.c*/#include     <stdio.h>
#include     <stdlib.h> 
#include     <unistd.h>  
#include     <sys/types.h>
#include     <sys/stat.h>
#include     <fcntl.h> 
#include     <termios.h>
#include     <errno.h>  #include "iic.h"#define I2C_ADDR  0x30 //从设备地址 如果单片机的i2c从地址是0x30
#define DATA_LEN  15#define DEV_NANE "/dev/i2c-1"int main(void)
{unsigned int uiRet;int i;unsigned char tx_buf[DATA_LEN];unsigned char rx_buf[DATA_LEN];unsigned char addr[2] ;addr[0] = 0x00;GiFd = open(DEV_NANE, O_RDWR|O_NONBLOCK);   if(GiFd < 0)perror("open i2c-1\n");printf("i2c1 open ok\r\n");//设置i2c的地址位宽,0:7bit addr;1:10bit addr.uiRet = ioctl(GiFd, I2C_TENBIT, 0);if (uiRet < 0) {printf("setenv addr bit faile ret: %x \n", uiRet);return -1;}	//设置通信从设备地址uiRet = ioctl(GiFd, I2C_SLAVE, I2C_ADDR >> 1);if (uiRet < 0) {printf("setenv address faile ret: %x \n", uiRet);return -1;}for (i = 0; i < DATA_LEN; i++) //写将要发送的数据到 发送buftx_buf[i] = i+1; for (i = 0; i < DATA_LEN; i++){ //写要发送的数据到 24c02addr[0] = 0x30; //当前地址write(GiFd, addr, 1);  //写地址write(GiFd, &tx_buf[i], 1); //写数据}// addr[0] = 0x00; //当前地址// write(GiFd, addr, 1);  //写地址// read(GiFd, rx_buf, DATA_LEN); //读数据// printf("read from eeprom:");// for(i = 0; i < DATA_LEN; i++) {//  	printf(" %x", rx_buf[i]);// }printf("\n");return 0;
}
/*iic.h*/#ifndef __I2C_H_
#define __I2C_H_#define I2C_SLAVE	0x0703
#define I2C_TENBIT	0x0704int GiFd;int GiIndex;int  iicOpen();int waitIRQ();
void waitset();void setdriverTo500smod();
void setdriverToCOMMmod();#endif

(1) ioctl函数的使用:
原型:struct ioctl(struct file *file,unsigned int cmd,unsigned long arg);
 cmd有I2C_SLAVE,I2C_SLAVE_FORCE,I2C_TENBIT,I2C_SET_SPEED几个选项;
    I2C_SLAVE:对应的arg取值为I2C从机地址,用来设定I2C从机地址;

    I2C_SLAVE_FORCE:对应的arg取值为I2C从机地址,用来修改I2C从机地址;

    I2C_TENBIT:对应的arg取值为0:从机地址为7 bit;对应的arg取值为1:从机地址为10bit。用来指定I2C从机地址的位数;  

    I2C_SET_SPEED:对应的arg取值为I2C总线控制器分频值。用来设置I2C总线控制器时钟频率;


    常用设置设置I2c从机地址为0xA0,如果选用at24c08设备,那么从机是7 bit地址,所以要右移1位,指定从机地址为7 bit,

ioctl(fd,I2C_TENBIT,0)。
ioctl(fd,I2C_SLAVE,0xA0>>1);

上面贴的代码中,没有I2C_SLAVE_FORCE和I2C_SET_SPEED设置项,这个应该是示例中没有给出的,I2C_SLAVE 的值为何是0x0703,暂时没有找到依据,猜测是驱动里面给这个值过去后,会将I2C设备的某个寄存器进行相应的设置,I2C_TENBIT也同理。

二、linux下i2c设备的读写操作

read()与write()函数的使用
假设子地址为48,向有子地址的器件写进7个字节:

unsigned char buf[8]={48,'a','b','c','d','e','f','g');/*第1个字节48为子地址*/

write(fd,buf,9);/*写进7个字节,第1个字节为子地址*/

从有子地址的I2C器件读取7个字节:
unsigned char suba=0,recbuf[20];
write(fd,buf,1);/*发送子地址0*/
read(fd,recbuf,7);/*从子地址48开始读取7个字节*/

三、linux下i2c的结束标志位
linux下I2C做主设备读写数据时,结束标志都由主设备给出,如果发现MCU设备没有退出I2C中断,需检查MCU的I2C中断配置是否有问题。

 

四、通信效果


 

这篇关于Linux学习之i-mx287学习:ARM9与GD32F407的I2C通信(ioctl,write,read)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_28643619/article/details/102184839
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/461180

相关文章

基于C#实现MQTT通信实战

《基于C#实现MQTT通信实战》MQTT消息队列遥测传输,在物联网领域应用的很广泛,它是基于Publish/Subscribe模式,具有简单易用,支持QoS,传输效率高的特点,下面我们就来看看C#实现... 目录1、连接主机2、订阅消息3、发布消息MQTT(Message Queueing Telemetr

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

ubuntu16.04如何部署dify? 在Linux上安装部署Dify的技巧

《ubuntu16.04如何部署dify?在Linux上安装部署Dify的技巧》随着云计算和容器技术的快速发展,Docker已经成为现代软件开发和部署的重要工具之一,Dify作为一款优秀的云原生应用... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。它

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Linux系统调试之ltrace工具使用与调试过程

《Linux系统调试之ltrace工具使用与调试过程》:本文主要介绍Linux系统调试之ltrace工具使用与调试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、ltrace 定义与作用二、ltrace 工作原理1. 劫持进程的 PLT/GOT 表2. 重定

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

Linux搭建单机MySQL8.0.26版本的操作方法

《Linux搭建单机MySQL8.0.26版本的操作方法》:本文主要介绍Linux搭建单机MySQL8.0.26版本的操作方法,本文通过图文并茂的形式给大家讲解的非常详细,感兴趣的朋友一起看看吧... 目录概述环境信息数据库服务安装步骤下载前置依赖服务下载方式一:进入官网下载,并上传到宿主机中,适合离线环境

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti