linux2.4 GPIO模拟实现I2C数据传输-DS1302

2023-11-04

1。我们要实现通过GPIO读写 DS1302的寄存器数据;

2。首先我们需要了解下DS1302的工作方式,它提供SCL、DATA、RST三个信号,然后可以参考其时序图进行数据的读写;

3。我们现在就是要通过GPIO来模拟整个读写的时序;

4。下面的代码是linux2.4下的,当然只能适合我的CPU,应该不同的CPU的GPIO寄存器地址都不一样,如果你使用需要修改;

头文件主要定义了DS1302的操作地址、及tm时间结构等;

/* $Id: rtc.h,v 1.3 2001/03/21 09:56:31 magnusmn Exp $ */


#ifndef DS1302_H
#define DS1302_H


#include <linux/config.h>
#include <linux/ioctl.h>


/* Dallas DS1302 clock/calendar register numbers */
/*
#define RTC_SECONDS 0
#define RTC_MINUTES 1
#define RTC_HOURS 2
#define RTC_DAY_OF_MONTH 3
#define RTC_MONTH 4
#define RTC_WEEKDAY 5
#define RTC_YEAR 6
#define RTC_CONTROL 7
*/


#define RTC_SECONDS 0x80
#define RTC_MINUTES 0x82
#define RTC_HOURS   0x84
#define RTC_DAY_OF_MONTH 0x86
#define RTC_MONTH   0x88
#define RTC_WEEKDAY 0x8a
#define RTC_YEAR    0x8c
#define RTC_CONTROL 0x8e
#define RTC_TRICKLECHARGER 0x90
/* Bits in CONTROL register */
#define RTC_CONTROL_WRITEPROTECT 0x80
//#define RTC_TRICKLECHARGER 8
/* Bits in TRICKLECHARGER register TCS TCS TCS TCS DS DS RS RS */
#define   RTC_TCR_PATTERN 0xA0 /* 1010xxxx */
#define   RTC_TCR_1DIOD 0x04 /* xxxx01xx */
#define   RTC_TCR_2DIOD 0x08 /* xxxx10xx */
#define   RTC_TCR_DISABLED 0x00 /* xxxxxx00 Disabled */
#define   RTC_TCR_2KOHM 0x01      /* xxxxxx01 2KOhm */
#define   RTC_TCR_4KOHM 0x02      /* xxxxxx10 4kOhm */
#define   RTC_TCR_8KOHM 0x03      /* xxxxxx11 8kOhm */


#ifdef CONFIG_ETRAX_DS1302
#define CMOS_READ(x) ds1302_readreg(x)
#define CMOS_WRITE(val,reg) ds1302_writereg(reg,val)
#define RTC_INIT() ds1302_init()
#else
/* no RTC configured so we shouldn't try to access any */
#define CMOS_READ(x) 42
#define CMOS_WRITE(x,y)
#define RTC_INIT() (-1)
#endif


/* conversions to and from the stupid RTC internal format */


#define BCD_TO_BIN(x) x = (((x & 0xf0) >> 3) * 5 + (x & 0xf))
#define BIN_TO_BCD(x) x = (x % 10) | ((x / 10) << 4) 


/*
 * The struct used to pass data via the following ioctl. Similar to the
 * struct tm in <time.h>, but it needs to be here so that the kernel 
 * source is self contained, allowing cross-compiles, etc. etc.
 */


struct rtc_time {
	int tm_sec;
	int tm_min;
	int tm_hour;
	int tm_mday;
	int tm_mon;
	int tm_year;
	int tm_wday;
	int tm_yday;
	int tm_isdst;
};


#define RTC_MAJOR_NR  230
/*
 * ioctl calls that are permitted to the /dev/rtc interface
 */


#define RTC_RD_TIME	_IOR('p', 0x09, struct rtc_time) /* Read RTC time   */
#define RTC_SET_TIME	_IOW('p', 0x0a, struct rtc_time) /* Set RTC time    */
#define RTC_SET_CHARGE  _IOW('p', 0x0b, int) /* Set CHARGE mode    */


//#define RTC_RD_TIME	66
//#define RTC_SET_TIME	77
//#define RTC_SET_CHARGE  88


#endif





实现文件

/*!***************************************************************************
*!
*! FILE NAME  : ds1302.c
*!
*! DESCRIPTION: Implements an interface for the DS1302 RTC through Etrax I/O
*!
*! Functions exported: ds1302_readreg, ds1302_writereg, ds1302_init, get_rtc_status
*! ---------------------------------------------------------------------------
*!
*! (C) Copyright 1999, 2000, 2001  Axis Communications AB, LUND, SWEDEN
*!
*! $Id: ds1302.c,v 1.11 2001/06/14 12:35:52 jonashg Exp $
*!
*!***************************************************************************/
/*
#include <linux/config.h>


#include <linux/fs.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <linux/blkdev.h>
#include <asm/uaccess.h>
#include <asm/system.h>
//#include <asm/svinto.h>
#include <asm/io.h>*/
#include <linux/fs.h>
#include <linux/iobuf.h>
//#include <linux/major.h>   
#include <linux/blkdev.h>
#include <linux/capability.h>
#include <linux/smp_lock.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <linux/module.h>




//#include <asm/rtc.h>
//#include <linux/rtc.h>
#include "ds1302n.h"


static int init_module(void);
static void cleanup_module(void);
static int  ds1302_open(struct inode*, struct file *);
static int  ds1302_close(struct inode*, struct file *);
static int  rtc_ioctl(struct inode*inode,struct file *flip,unsigned int cmd,unsigned long arg);
static void ds1302_release(struct inode*inode, struct file *filp);




#define GPIO_MODE_OUTOFF 0x00
#define GPIO_MODE_INOFF  0x04
#define GPIO_MODE_DIROFF 0x08
#define GPIO_MODE_PULLENOFF  0x18
#define GPIO_MODE_PULLTYOFF  0x1C




#define DS1302_RST  0x0001
#define DS1302_SCL  0x0002
#define DS1302_SDA  0x0004


#define INN  0
#define OUTT 1




//#define RTC_MAJOR_NR 121 /* local major, change later */


static const char ds1302_name[] = "ds1302";


/* The DS1302 might be connected to different bits on different products. 
 * It has three signals - SDA, SCL and RST. RST and SCL are always outputs,
 * but SDA can have a selected direction.
 * For now, only PORT_PB is hardcoded.
 */


/* The RST bit may be on either the Generic Port or Port PB. */
/*
#ifdef CONFIG_ETRAX_DS1302_RST_ON_GENERIC_PORT
#define TK_RST_OUT(x) REG_SHADOW_SET(R_PORT_G_DATA,  port_g_data_shadow,  CONFIG_ETRAX_DS1302_RSTBIT, x)
#define TK_RST_DIR(x)
#else
//#define TK_RST_OUT(x) REG_SHADOW_SET(R_PORT_PB_DATA, port_pb_data_shadow, CONFIG_ETRAX_DS1302_RSTBIT, x)
//#define TK_RST_DIR(x) REG_SHADOW_SET(R_PORT_PB_DIR,  port_pb_dir_shadow,  CONFIG_ETRAX_DS1302_RSTBIT, x)
#define TK_RST_OUT(x)   write_gpio_bit(GPIO_MODE_OUT | DS1302_RST,x)
#define TK_RST_DIR(x)
#endif




//#define TK_SDA_OUT(x) REG_SHADOW_SET(R_PORT_PB_DATA, port_pb_data_shadow, CONFIG_ETRAX_DS1302_SDABIT, x)
#define TK_SDA_OUT(x)   write_gpio_bit(GPIO_MODE_OUT | DS1302_SDA,x)
//#define TK_SCL_OUT(x) REG_SHADOW_SET(R_PORT_PB_DATA, port_pb_data_shadow, CONFIG_ETRAX_DS1302_SCLBIT, x)
#define TK_SCL_OUT(x)   write_gpio_bit(GPIO_MODE_OUT | DS1302_SCL,x)


//#define TK_SDA_IN()   ((*R_PORT_PB_READ >> CONFIG_ETRAX_DS1302_SDABIT) & 1)
#define TK_SDA_IN()     read_gpio_bit(DS1302_SDA)


//#define TK_SDA_DIR(x) REG_SHADOW_SET(R_PORT_PB_DIR,  port_pb_dir_shadow,  CONFIG_ETRAX_DS1302_SDABIT, x)
//#define TK_SDA_DIR(x)   (if(x==1) set_gpio_ctrl(GPIO_MODE_OUT | DS1302_SDA); else set_gpio_ctrl(GPIO_MODE_IN | DS1302_SDA); )
#define TK_SDA_DIR(x) set_gpio_ctrl(x | DS1302_SDA)
//#define TK_SCL_DIR(x) REG_SHADOW_SET(R_PORT_PB_DIR,  port_pb_dir_shadow,  CONFIG_ETRAX_DS1302_SCLBIT, x)
#define TK_SCL_DIR(x)*/
/* 1 is out, 0 is in */


void TK_SDA_OUT(char x)
{
	int tmp;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux2.4 GPIO模拟实现I2C数据传输-DS1302 的相关文章

  • 车牌识别系统Matlab算法实现

    车牌识别系统Matlab算法实现 标签 车牌识别 2014 10 29 10 51 1408人阅读 评论 0 收藏 举报 本文章已收录于 分类 机器学习 21 作者同类文章 X plain view plain copy print
  • MindSpore报错“TypeError: parse() missing 1 required positional.“

    1 报错描述 1 1 系统环境 ardware Environment Ascend GPU CPU CPU Software Environment MindSpore version source or binary 1 6 0 Pyt
  • C++知识整理系列(三)—— constexpr常量表达式

    const修饰常量 但是const并未区分编译时常量和运行时常量 而constexpr则只能是编译时常量 在C 11中提出 这篇文章 将详细讲解constexpr 目录 一 常量表达式 二 constexpr变量 三 constexpr函数
  • H264与MPEG中I、P、B帧编码的不同

    暂时没时间去研究I P B帧是否真的在H 264与MPEG中不一样 先转过来 1 H264中I P B 帧编码的基本流程 I 帧编码的基本流程为 1 进行帧内预测 决定所采用的帧内预测模式 2 像素值减去预测值 得到残差 3 对残差进行变换
  • php结合layui前端实现 多图上传

    1 效果图 效果图上完了 就开始代码咯 2 前端html代码 div class layui upload div
  • 快速入门jest单元测试、mock测试、dom测试、快照测试

    写在前面 本文参考然叔老师的全栈架构成长计划课程中的单元测试部分 对课程学习做了总结 有兴趣的可以去B站搜索 全栈然叔 能够学习到比较前沿的东西 一 单元测试 JavaScript 缺少类型检查 编译期间无法定位到错误 单元测试可以帮助你测
  • 无向图的邻接矩阵

    无向图的邻接矩阵的定义 表示法 度 定义 逻辑结构分为两部分 V和E集合 其中 V是顶点 E是边 因此 用一个一维数组存放图中所有顶点数据 用一个二维数组存放顶点间关系 边或弧 的数据 这个二维数组称为邻接矩阵 邻接矩阵又分为有向图邻接矩阵
  • 多选框和按钮

    p 爱好 p

随机推荐

  • maven仓库地址https://mvnrepository.com/

    之前百度搜maven 前几个就能找到这个网址 现在不容易搜到了 记录一下 maven公共仓库地址 https mvnrepository com
  • response.setContentType()的作用及参数(转载)

    response setContentType MIME 的作用是使客户端浏览器 区分不同种类的数据 并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据 例如web浏览器就是通过MIME类型来判断文件是GIF图片 通过MIM
  • JVM 中的垃圾回收算法详解,一文读懂GC回收机制

    JVM 中的垃圾回收算法 垃圾回收是一种自动化的内存管理方式 它可以监测并清除内存中不再使用的对象 使得内存空间可以被回收并重新利用 在 JVM 中 垃圾回收器负责管理虚拟机的内存分配和回收 JVM 中常见的垃圾回收算法主要包括 标记 清除
  • MinGW-W64安装说明

    Architecture Threads Exception 运行平台 多线程 异常处理 Architecture 说明 i686 32位系统 x86 64 64位系统 Threads 说明 posix 使用std thread创建线程 w
  • jdk安装遇见的问题

    问题 安装jdk后 在cmd中输入 java version 显示了JDK的版本 但是输入 javac version 显示 javac 不是内部命令 说明CLASSPATH的环境变量不正确 解决办法 设置CLASSPATH为 JAVA H
  • Tensorflow-serving部署模型到服务器

    Tensorflow serving部署模型到服务器 1 启动docker systemctl start docker 2 查看已经下载的镜像 docker images 如果没有 那么拉取镜像 docker pull tensorflo
  • 【Java】BigDecimal使用不当导致的生产事故

    BigDecimal使用不当导致的生产事故 背景 事故详情 分析 总结 背景 我们在使用金额计算或者展示金额的时候经常会使用 BigDecimal 也是涉及金额时非常推荐的一个类型 BigDecimal 自身也提供了很多构造器方法 这些构造
  • Nginx+Tomcat(多实例)实现动静分离和负载均衡

    一 Tomcat 多实例部署 1 在安装好jdk环境后 添加两例tomcat服务 解压安装包 cd opt tar zxvf apache tomcat 9 0 16 tar gz 移动并复制一例 mkdir usr local tomca
  • vue使用高德地图获取定位

    先在vue config js中配置 module exports lintOnSave false configureWebpack externals AMap AMap
  • git命令之追溯文件修改记录:git blame 和 git show【笔记】

    目录 1 git blame 1 1 git blame用法 1 2 举例 2 git show 2 1 git show命令详解 语法 参数 说明 2 2 显示提交详情 语法 案例 2 3 显示标签详情 语法 案例 2 4 显示某次提交某
  • C++编写一个返回字符串的函数

    创建一个函数 函数返回一个指针 函数接受两个参数 一个字符 一个数字 使用new创建一个长度与数字参数相等的字符串 将每个元素都初始化为该字符 返回指向新字符串的指针 include
  • 博图V13+PLCSIM+ NettoplcsimS7o121+KEPServer模拟PLC运行及与上位机通信

    在做此相关的项目 之前一直要到工程现场才可以去开发 验证上位机程序 一直想在本地的笔记本电脑就能够完成模拟 现在用此技术就可以实现了 直接模拟运行PLC程序 然后通过NettoplcsimS7o121与KEPServer通信 这样就可以写上
  • 年轻人是应该先存钱还是先提高生活质量

    春节就快到了 大家是不是准备在这次的年货打折季中大大出手呢 也许你想先用花呗或者信用卡买买买 也有可能想把用来买东西的钱一点一点攒下来 虽然这二者都是为自己投资 但实际上有着本质上的区别 那究竟是应该先存钱还是先提高生活质量呢 先存钱还是先
  • ideavim 使用分享

    ideavim 使用分享 ideavim 使用 ideavim介绍 ideavim是JetBrains官方开发的模拟vim插件 熟练ideavim的人可以更快的进行操作 大部分操作都可以用键盘来代替 纯vim也能进行更高效的开发 但是一款适
  • Linux:Gentoo系统的安装笔记(一)

    这次我选择安装Gentoo 用来做我学习的笔记 这次我是使用虚拟机安装Gentoo 一是方便操作 二是可以看着手册 一边看一边操作 严格按照手册上的步骤执行 一般是不会出现问题的 查看手册最好学会看英文原版的 因为更新快 中文原版的可能很久
  • 指针指向字符串

    2017 06 27 原来一直没有用过这种用法 char p hello 这种方法是不能使用指针p去修改字符串内容的 一般来说 我理解的只有加上const修饰符才可以 实际上两者是等价的 这里的原因是 这个字符串本身放置在只读的内存空间里
  • 机器学习笔记13——支持向量机(SVM)模型原理以及python实现案例

    支持向量机 SVM 1 概述 2 基本概念 2 1 线性可分 2 2 函数间隔和几何间隔 2 3 间隔最大化 硬间隔最大化 2 4 凸优化问题 2 5 支持向量和间隔边界 2 6 对偶问题 3 线性可分支持向量机 3 1定义 3 2 优化目
  • Navicat连接MariaDB出错:1130-host . is not allowed to connect to this mysql server,

    在安装mysql的机器上运行 mysql u root password mysql gt usemysql mysql gt update user set host where user root mysql gt select hos
  • JavaScript foreach 方法跳出循环

    通常 在 for循环中跳出循环可以用 break或者 continue 来跳出循环 break 跳出循环 continue 跳过当次循环 而有时候需要在 foreach 中跳出循环 该怎么做呢 forEach 方法用于调用数组的每个元素 并
  • linux2.4 GPIO模拟实现I2C数据传输-DS1302

    1 我们要实现通过GPIO读写 DS1302的寄存器数据 2 首先我们需要了解下DS1302的工作方式 它提供SCL DATA RST三个信号 然后可以参考其时序图进行数据的读写 3 我们现在就是要通过GPIO来模拟整个读写的时序 4 下面