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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/461180

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置