pi 模拟i2c io读取24c 例

用树霉pi的io模拟i2c协议读取 24c256 eeprom

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>#include "gpio.h"#define I2CFREQ 1e5
#define DT CPUFREQ/I2CFREQ/2
// #define DT 1e6 / I2CFREQ / 2 // usleep
typedef struct {int sda;int scl;
}I2C;
I2C i2c;void i2cSetup(int scl, int sda)
{i2c.scl = scl;i2c.sda = sda;pinMode(scl,OUTPUT);pinMode(sda,OUTPUT);setPud(scl,PUD_UP);   //上拉模式,测试不上拉也可以setPud(sda,PUD_UP);
}void i2cRelease() {pinMode(i2c.scl, INPUT);pinMode(i2c.sda, INPUT);setPud(i2c.scl,PUD_OFF);setPud(i2c.sda,PUD_OFF);
}void delay(){ delaycycle(DT); }    //usleep(DT);
int waitPin(int pin, int val) {int n = 0, times = 10;while((readPin(pin) != val) && n++ < times)delay();return (n >= 10) ? -1 : 0;
}void SCL(int val) { writePin(i2c.scl, val & 1); }
void SDA(int val) { writePin(i2c.sda, val & 1); }
int readSCL() { return readPin(i2c.scl); }
int readSDA() { return readPin(i2c.sda); }
int writeWaitSDA(int val) { SDA(val); delay(); return waitPin(i2c.sda,val); }
int writeWaitSCL(int val) { SCL(val); delay(); return waitPin(i2c.scl,val);}int i2cStart()
{writeWaitSCL(0);writeWaitSCL(1);writeWaitSDA(1);writeWaitSDA(0);writeWaitSCL(0);
}void i2cStop()
{writeWaitSCL(0);writeWaitSDA(0);writeWaitSCL(1);writeWaitSDA(1);
}void i2cSendBit( int bit)
{writeWaitSCL(0);writeWaitSDA(bit);writeWaitSCL(1);
}int i2cReceiveBit()
{writeWaitSCL(0);SDA(1);   // release sda SCL(0);writeWaitSCL(1);return readSDA();
}void i2cSendByte(unsigned char data)
{for(int i = 0; i < 8; i++) {i2cSendBit((data>>7) & 1);data <<= 1;}
}
int i2cSendByteA(unsigned char data) {i2cSendByte(data);return i2cReceiveBit();
}unsigned char i2cReceiveByte() {unsigned char data = 0;for(int i = 0; i < 8; i++) {data <<= 1;data |= ( i2cReceiveBit() & 1);}return data;
}
unsigned char i2cRecieveByteA() {unsigned char data;data = i2cReceiveByte();i2cSendBit(0);return data;
}unsigned char i2cRecieveByteNA() {unsigned char data;data = i2cReceiveByte();i2cSendBit(1);return data;
}unsigned char at24ReadCur(unsigned char id) {   //read current address cnti2cStart();if( i2cSendByteA( id << 1 | 1) == 1) {printf("cannot access %x, check wire\n",id);return 0;}unsigned char data = i2cRecieveByteNA();i2cStop();return data;
}
unsigned char at24ReadAddr(unsigned char id, int addr)
{i2cStart();if( i2cSendByteA( id << 1 | 0) == 1) {printf("cannot access %x, check wire\n",id);return 0;}i2cSendByteA( (addr>>8) & 0xff);i2cSendByteA (addr & 0xff);return at24ReadCur(id);
}
void at24WriteLen(unsigned char id, int addr,char* buf, int len)
{i2cStart();if( i2cSendByteA( id << 1 | 0) == 1) {printf("cannot access %x, check wire\n",id);return 0;}i2cSendByteA( (addr>>8) & 0xff );i2cSendByteA (addr & 0xff);for( int i = 0; i < len-1; i++){i2cSendByteA(buf[i]);}i2cStop();delayus(5000);// usleep(5000);
}int main()
{gpioSetup();i2cSetup(22, 27);int res = 0;for(int i = 0; i < 10 ; i++)//printf("curadr %0x\n",at24ReadCur(0x50));printf("adr %x %0x\n",i,at24ReadAddr(0x50,i));printf("\n");i2cRelease()gpioRelease();
}

用的上一篇发的简易库,重发下
gpio.h

#define BCM2835_PERI_BASE  0x20000000 
#define GPIO_BASE   (BCM2835_PERI_BASE + 0x200000)
#define CPUFREQ  7e8enum Mode { INPUT,OUTPUT };
enum PullMode {PUD_OFF,PUD_DOWN,PUD_UP};void delaycycle(unsigned int cnt);
void delayus(unsigned int cnt) ;
int gpioSetup();
int gpioRelease();
void pinMode(int pin, int mode);
void writePin(int pin, int value);
int readPin(int pin);
void setPud(int pin, int value);
unsigned long long readAllPin();

gpio.c

#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include "gpio.h"#define PAGE_SIZE 4096int fd;
uint32_t* gpio;void rstccnt()
{unsigned int tmp;asm volatile (  "mrc p15, 0, %0, c15, c12, 0 \n""orr %0,%0,%1 \n""mcr p15, 0, %0, c15, c12, 0 \n":"+r" (tmp) : "r"(0x4));
}unsigned int readccnt()
{unsigned int tmp;asm volatile ("mrc p15, 0, %0, c15, c12, 1 \n":"=r" (tmp));return tmp;
}
void delaycycle(unsigned int cnt)
{unsigned int tmp;rstccnt();tmp = readccnt();while(tmp < cnt)tmp = readccnt();
}void delayus(unsigned int cnt) // cycle counter delay
{//cnt = ((CPUFREQ>>6) * cnt) >> 3 ;// avoid overflow    unsigned long long ct = cnt;cnt = (CPUFREQ*ct)/1e6;unsigned int tmp;rstccnt();tmp = readccnt();while(tmp < cnt)tmp = readccnt();
}
int gpioSetup(){char* fname = "/dev/gpiomem";fd = open(fname,O_RDWR | O_SYNC | O_CLOEXEC);gpio  =  mmap(0,PAGE_SIZE,PROT_READ | PROT_WRITE,MAP_SHARED,fd,GPIO_BASE);
}int gpioRelease(){munmap(gpio,PAGE_SIZE);close(fd);
}
void pinMode(int pin, int mode)
{unsigned int offset = pin / 10;unsigned int shift = (pin%10)*3;*(gpio+offset) &= ~(0x7 << shift);if (mode == OUTPUT)*(gpio+offset) |= (1<< shift);
}#define SET0 7
#define CLR0 10
void writePin(int pin, int value)
{unsigned int offset = pin / 32;unsigned int shift = pin % 32;if(value == 0)*(gpio+CLR0+offset)= 1<<shift;else*(gpio+SET0+offset)= 1<<shift;}#define LEV0 13 
int readPin(int pin)
{unsigned int offset = pin / 32;unsigned int shift = pin % 32;unsigned int value = *(gpio+LEV0+offset);return (value >> shift) & 1;
}
unsigned long long  readAllPin()
{unsigned long long res = *(gpio+LEV0+1);
return  res = (res << 32) | *(gpio+LEV0);
//      unsigned long long* res1 = gpio+LEV0;
//      return *res1;
}#define PUD 37
#define PUDCLK0 38
void setPud(int pin, int value)
{
//      unsigned int prepud= *(gpio+PUD);
//      unsigned int prepudclk = *(gpio+PUDCLK0+offset);unsigned int offset = pin / 32;unsigned shift = pin % 32;*(gpio+PUD)=value;delaycycle(150);//*(gpio+PUDCLK0+offset) = prepudclk|(1<<shift);*(gpio+PUDCLK0+offset) |= (1<<shift);delaycycle(150);*(gpio+PUD) = 0;*(gpio+PUDCLK0+offset) = 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/632505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【leetcode题解C++】54.螺旋矩阵I and 59.螺旋矩阵II

54.螺旋矩阵I 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;m…

C# 实现单线程异步互斥锁

文章目录 前言一、异步互斥锁的作用是什么&#xff1f;示例一、创建和销毁 二、如何实现&#xff1f;1、标识&#xff08;1&#xff09;标识是否锁住&#xff08;2&#xff09;加锁&#xff08;3&#xff09;解锁 2、异步通知&#xff08;1&#xff09;创建对象&#xff08;2&a…

技术分享:PHP读取TXT文本内容的五种实用方法

在Web开发中&#xff0c;我们经常需要读取和处理文本文件。PHP作为一种流行的服务器端脚本语言&#xff0c;提供了多种方法来读取TXT文本内容。本文将介绍五种不同的PHP教程&#xff0c;帮助您学习如何使用PHP读取TXT文本内容。PHP读取文件内容在实际开发当中&#xff0c;还是比…

Python单元测试之pytest的使用

一、前提准备 1、前提&#xff1a;需要安装pytest和pytest-html(生成html测试报告&#xff09; pip install pytest 和 pip install pytest-html 安装插件&#xff1a;pip install 插件名 2、命名规范 Pytest单元测试中的类名和方法名必须是以test开头,执行中只能找到test开…

Spring(19) ThreadPoolTaskExecutor 线程池的使用

目录 一、线程池简介1.1 为什么使用线程池1.2 线程池为什么需要使用队列1.3 线程池为什么要使用阻塞队列而不是用非阻塞队列1.4 如何配置线程池1.5 execute() 和 submit() 方法 二、ThreadPoolTaskExecutor 线程池简介2.1 简介2.2 核心参数配置2.3 ThreadPoolTaskExecutor 内部…

数据库作业三

1.创建student和score表 2.为student表和score表增加记录 3.查询student表的所有记录 4.查询student表的第2条到4条记录 5.从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;name&#xff09;和院系&#xff08;department&#xff09;的信息 6.从st…

Pandas实战100例 | 案例 58: 创建数据透视表

案例 58: 创建数据透视表 知识点讲解 数据透视表是一种常用的数据汇总工具,它允许你在多个维度上重塑和汇总数据。Pandas 提供了 pivot_table 方法来创建数据透视表。 创建数据透视表: 使用 pivot_table 方法,你可以指定值、索引、列和聚合函数来创建数据透视表。这使得数据…

React导航守卫(V5路由)

下载&#xff1a; npm i react-router-dom5 当我们进行路由跳转的时候&#xff0c;有时候需要满足某种条件才能跳转&#xff0c;比如我只有我们登录成功之后才能到首页面&#xff0c;否则就不能到首页面&#xff0c;这时候我们就需要对路由进行拦截。 例如&#xff1a; (1)…

flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法

问题描述 问题1&#xff1a;当你使用FormData.from(Flutter3直接不能用)的时候&#xff0c;可能会提示没有这个方法&#xff0c;或者使用FormData.fromMap(flutter3的dio支持)的时候也提示没有&#xff0c;这时候可能就是和get库里面的Formdata冲突了 问题1&#xff1a;The me…

C //练习 8-2 用字段代替显式的按位操作,重写fopen和_fillbuf函数。比较相应代码的长度和执行速度。

C程序设计语言 &#xff08;第二版&#xff09; 练习 8-2 练习 8-2 用字段代替显式的按位操作&#xff0c;重写fopen和_fillbuf函数。比较相应代码的长度和执行速度。 注意&#xff1a;代码在win32控制台运行&#xff0c;在不同的IDE环境下&#xff0c;有部分可能需要变更。 …

easydarwin 下面easywasmplayer和easyplayer

拷贝大佬们&#xff0c;起码验证能用再写文章&#xff0c;找到的各种坑 easydarwin/easywasmplayer - npm 区别 easyplayer&#xff1a;在与vue2结合的时候没有问题&#xff0c;但是用在vue3中&#xff0c;就是提示各种缺东西&#xff0c;你就是将所有文件引入到index.html都…

github clone Failed to connect to github.com port 443 after xxx ms

最近克隆github项目时老是报超时&#xff0c;可以尝试以下解决方法 如果本地开启了代理还是clone超时&#xff0c;可以尝试最后一种方式解决 1、把 https 换成 http&#xff0c;如&#xff1a; git clone http:xxx2、更新本地hosts配置&#xff0c;可以参考这篇文章获取最新的…

vue基于spring boot框架的发艺美发店理发店管理系统的设计q9xpe

店铺信息、美发信息是发艺美发店管理系统的重要组成部分&#xff0c;信息清晰、详细、准确&#xff0c;能够有效地促进发艺美发店管理系统的运行[5]。基础设定函数是对整个系统的总体布局进行合理安排&#xff0c;包括&#xff1a;店铺活动、物品信息、领用信息等。通过对各类资…

【C++】vector模拟实现过程中值得注意的点

Hello大家好&#xff01;我是咕噜的铁蛋&#xff01;C中的vector是一种动态数组&#xff0c;它能够根据需要自动增长和缩小。虽然C标准库已经为我们提供了vector的实现&#xff0c;但在某些情况下&#xff0c;我们可能需要自己模拟实现一个类似于vector的数据结构。今天铁蛋将给…

CPU密集型计算、IO密集型计算、多进程、多线程

参考链接&#xff1a; 使用多进程multiprocessing模块加速程序的运行_哔哩哔哩_bilibili 什么是CPU密集型计算、IO密集型计算&#xff1a; CPU密集型&#xff1a; CPU密集型也叫计算密集型&#xff0c;是指I/O在很短的时间就可以完成&#xff0c;CPU需要大量的计算和处理&a…

javaweb学习day01(HTML)

一、B/S 软件开发架构简述 1 Java Web 技术体系图 2 B/S 软件开发架构简述 B/S架构 前端 后端 数据库 二、HTML 1 官方文档 地址: https://www.w3school.com.cn/html/index.asp 离线文档: W3School 离线手册(2017.03.11 版).chm 2 网页 3 HTML 介绍 3.1 HTML 是什么…

oop面向对象编程python

1.定义一个圆类&#xff08;Circle&#xff09;,求圆的面积和周长 import mathclass Circle():def __init__(self, R ,name):self.radius Rself.name namedef girth(self):return 2 * self.radius * math.pidef area(self):return self.radius ** 2 * math.pic1 Circle(10,&q…

python 常用功能积累

sql查询 import pymysql import pandas as pduser #用户名 password #密码 dbName #库名 dbHost #ip dbPort 8888 con pymysql.connect(hostdbHost,portdbPort,useruser,passwordpassword,databasedbName,charsetutf8) cursor con.cursor() head ["Id"…

React16源码: React中调度之requestWork的源码实现

requestWork 1 &#xff09;概述 在 scheduleWork 中&#xff0c;找到了创建更新的fiber对应的root节点然后对它进行了一些操作之后&#xff0c;调用了 requestWork&#xff0c;开始请求工作在 requestWork 里面它会做哪些东西呢&#xff1f; 首先我们要把这个root节点加入到调…

Qt所有容器之间的区别,以及如何简单使用?

Qt中常用的容器有 QList、QVector、QMap、QHash、QSet 等,它们都具有不同的特性和适用场景。 1. QList:动态数组,可以动态增加和删除元素,支持随机访问和迭代,适用于不需要频繁插入或删除元素的场景。 ```cpp QList<int> list; list.append(1); list.append(2); fo…