I.MX6 I2C DS1337 disable square-wave output
linux I2C DS1337 disable square-wave output
\\\\\\\\\\\-*- 目录 -*-//////////
| 一、DS1337访问寄存器说明:
| 二、cat main.c
| 三、cat i2c_data.c
| 四、cat i2c_data.h
| 五、cat Android.mk
--------------------------------
一、DS1337控制寄存器说明:
. reference:
. DS1337 I2C Serial Real-Time Clock
. How to: wire the DS1337 RTC?
http://forum.arduino.cc/index.php?topic=20937.0. SPECIAL-PURPOSE REGISTERS
The DS1337 has two additional registers (control and status) that control the RTC, alarms, and square-wave output.
. Control Register (0Eh)
+-------+-------+-------+-------+-------+-------+-------+-------+
| Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit |
+-------+-------+-------+-------+-------+-------+-------+-------+
| EOSC | | | RS2 | RS1 | INTCN | A2IE | A1IE |
+-------+-------+-------+-------+-------+-------+-------+-------+
. Bit : Enable Oscillator (EOSC). This active-low bit when set to logic starts the oscillator. When this bit is set to logic , the oscillator is stopped. This bit is enabled (logic ) when power is first applied.
. Bits and : Rate Select (RS2 and RS1). These bits control the frequency of the square-wave output when the square wave has been enabled. The table below shows the square-wave frequencies that can be selected with the RS bits. These bits are both set to logic (32kHz) when power is first applied.
. SQW/INTB Output:
+------+-----+-----+-----------+------+
| NTCN | RS2 | RS1 | SQW/INTB | A2IE |
| | | | OUTPUT | |
+------+-----+-----+-----------+------+
| | | | 1Hz | X |
+------+-----+-----+-----------+------+
| | | | .096kHz | X |
+------+-----+-----+-----------+------+
| | | | .192kHz | X |
+------+-----+-----+-----------+------+
| | | | .768kHz | X |
+------+-----+-----+-----------+------+
| | X | X | A2F | |
+------+-----+-----+-----------+------+
. Bit : Interrupt Control (INTCN). This bit controls the relationship between the two alarms and the interrupt output pins. When the INTCN bit is set to logic , a match between the timekeeping registers and the alarm registers l activates the INTA pin (provided that the alarm is enabled) and a match between the timekeeping registers and the alarm registers activates the SQW/INTB pin (provided that the alarm is enabled). When the INTCN bit is set to logic , a square wave is output on the SQW/INTB pin. This bit is set to logic when power is first applied.
. Bit : Alarm Interrupt Enable (A2IE). When set to logic , this bit permits the alarm flag (A2F) bit in the status register to assert INTA (when INTCN = ) or to assert SQW/INTB (when INTCN = ). When the A2IE bit is set to logic , the A2F bit does not initiate an interrupt signal. The A2IE bit is disabled (logic ) when power is first applied.
. Bit : Alarm Interrupt Enable (A1IE). When set to logic , this bit permits the alarm flag (A1F) bit in the status register to assert INTA. When the A1IE bit is set to logic , the A1F bit does not initiate the INTA signal. The A1IE bit is disabled (logic ) when power is first applied.
二、cat main.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include "i2c-dev.h"
#include "i2c.h"
#include "i2c_data.h"
int main ( int argc, char ** argv ) {
int fd,ret;
fd = open( "/dev/i2c-2", O_RDWR );
if ( fd < ) {
perror( "open error\n" );
}
unsigned char ch = ;
// 通过测试秒数来判断访问芯片DS1337没问题
// terminal output: get data from ds1337 0x00: 54
i2c_data_read_byte( fd, 0x68, 0x00, &ch );
printf( "get data from ds1337 0x00: %x\n", ch );
i2c_data_read_byte( fd, 0x68, 0x0e, &ch );
// terminal output: get data from ds1337 0x0e: 18
printf( "get data from ds1337 0x0e: %x\n", ch );
// 关闭方波输出
ch = 0x98;
i2c_data_write_byte( fd, 0x68, 0x0e, ch );
i2c_data_read_byte( fd, 0x68, 0x0e, &ch );
// terminal output: get data from ds1337 0x0e: 98
printf( "get data from ds1337 0x0e: %x\n", ch );
i2c_data_read_byte( fd, 0x68, 0x0F, &ch );
// terminal output: get data from ds1337 0x0f: 0
printf( "get data from ds1337 0x0f: %x\n", ch );
close( fd );
return ;
}
三、cat i2c_data.c
#include <stdio.h>
#include <string.h>
#include <linux/types.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <errno.h>
#include "i2c-dev.h"
#include "i2c.h"
#include "i2c_data.h"
// A demo for test
int eepromDemo ( int argc, char **argv ) {
int fd,ret;
fd = open("/dev/i2c-3",O_RDWR);
if ( fd < ) {
perror("open error\n");
}
unsigned char buf[] = {'x', 'x', 'x', '', 'y', 'm', '\0'};
i2c_data_write_byte( fd, 0x50, , 'z' );
i2c_data_write_byte( fd, 0x50, , 'j' );
i2c_data_write_byte( fd, 0x50, , 'f' );
//printf("i2c function test: %s\n", buf);
//i2c_data_write_byte (fd, 0x50, 3, buf[1]);
//i2c_data_read_str (fd, 0x50, 0, buf, array_size(buf)-1);
//unsigned char ch = 0;
i2c_data_read_byte(fd, 0x50, , &ch);
close(fd);
return ;
}
/*****************************************************************************
* 函数说明:
* 往i2c设备写数据,写一串字节
* 参数说明:
* 1. fd: 文件描述符
* 2. addr: i2c设备地址
* 3. offset: i2c设备内寄存器偏移地址
* 4. buf: 字节数组
* 5. count: 字节数组长度
* 返回值:
* 正常返回写入的个数,如果出错,返回错误码
****************************************************************************/
int i2c_data_write_str (int fd, int addr, int offset, unsigned char *buf, int count) {
int ret = ;
struct i2c_rdwr_ioctl_data i2c_data;
i2c_data.nmsgs = ; /* 每次只写一个字节 */
i2c_data.msgs = (struct i2c_msg*)malloc(i2c_data.nmsgs*sizeof(struct i2c_msg));
if(!i2c_data.msgs)
{
perror("i2c_data_write_str function malloc error.\n");
return -;
}
ioctl(fd, I2C_TIMEOUT, ); /*超时时间*/
ioctl(fd, I2C_RETRIES, ); /*重复次数*/
(i2c_data.msgs[]).buf = (unsigned char*)malloc();
int i = ;
for (i = ; i < count; i++) {
(i2c_data.msgs[]).len = ;
(i2c_data.msgs[]).addr = addr; //i2c 设备地址
(i2c_data.msgs[]).flags = ; //write
(i2c_data.msgs[]).buf[] = (unsigned char)offset+i; // i2c 写入目标的地址
(i2c_data.msgs[]).buf[] = (unsigned char)buf[i]; //the data to write
ret = ioctl(fd, I2C_RDWR, (unsigned long)&i2c_data);
if(ret < ) {
perror("i2c_data_write_str ioctl error");
return ret;
}
}
free((i2c_data.msgs[]).buf);
free(i2c_data.msgs);
return i;
}
/************************************************************************
* 函数说明:
* 往i2c设备写数据,写一个字节
* 参数说明:
* 1. fd: 文件描述符
* 2. addr: i2c设备地址
* 3. offset: i2c设备内寄存器偏移地址
* 4. buf: 要写入的字节
* 返回值:
* 正常返回0,出错,返回错误码;
************************************************************************/
int i2c_data_write_byte (int fd, int addr, int offset, unsigned char buf) {
int ret = ;
struct i2c_rdwr_ioctl_data i2c_data;
i2c_data.nmsgs = ; /* 每次只写一个字节 */
i2c_data.msgs = (struct i2c_msg*)malloc(i2c_data.nmsgs*sizeof(struct i2c_msg));
if(!i2c_data.msgs)
{
perror("i2c_data_write_byte function malloc error.\n");
return -;
}
ioctl(fd,I2C_TIMEOUT,); /*超时时间*/
ioctl(fd,I2C_RETRIES,); /*重复次数*/
(i2c_data.msgs[]).buf = (unsigned char*)malloc();
(i2c_data.msgs[]).len = ;
(i2c_data.msgs[]).addr = addr; //i2c 设备地址
(i2c_data.msgs[]).flags = ; //write
(i2c_data.msgs[]).buf[] = (unsigned char)offset; // i2c 写入目标的地址
(i2c_data.msgs[]).buf[] = (unsigned char)buf; //the data to write
ret = ioctl(fd, 0x0707, (unsigned long)&i2c_data);
if(ret < ) {
perror("i2c_data_write_byte ioctl error");
return ret;
}
free((i2c_data.msgs[]).buf);
free(i2c_data.msgs);
return ret;
}
/*************************************************************************
* 函数说明:
* 从i2c设备读数据,读一个字节
* 参数说明:
* 1. fd: 文件描述符
* 2. addr: i2c设备地址
* 3. offset: i2c设备内寄存器偏移地址
* 4. buf: 保存读出的字节指针
* 返回值:
* 正常返回0,出错,返回错误码;
************************************************************************/
int i2c_data_read_byte (int fd, int addr, int offset, unsigned char *buf) {
int ret;
struct i2c_rdwr_ioctl_data i2c_data;
i2c_data.nmsgs = ; /*读时序为2个开始信号*/
i2c_data.msgs = (struct i2c_msg*)malloc(i2c_data.nmsgs*sizeof(struct i2c_msg));
if(!i2c_data.msgs) {
perror("i2c_data_read_byte functionmalloc error");
exit();
}
ioctl(fd,I2C_TIMEOUT,); /*超时时间*/
ioctl(fd,I2C_RETRIES,); /*重复次数*/
(i2c_data.msgs[]).len = ; //i2c 目标数据的地址
(i2c_data.msgs[]).addr = addr; // i2c 设备地址
(i2c_data.msgs[]).flags = ; //write
(i2c_data.msgs[]).buf = (unsigned char*)malloc();
(i2c_data.msgs[]).buf[] = offset; //i2c 数据地址
(i2c_data.msgs[]).len = ; //读出的数据
(i2c_data.msgs[]).addr = addr; // i2c 设备地址
(i2c_data.msgs[]).flags = I2C_M_RD; //read
(i2c_data.msgs[]).buf = (unsigned char*)malloc();//存放返回值的地址。
(i2c_data.msgs[]).buf[] = ; //初始化读缓冲
ret = ioctl(fd, I2C_RDWR, (unsigned long)&i2c_data);
if(ret<) {
perror("i2c_data_read_byte ioctl error.\n");
return ret;
}
//printf("buff[0] = %x\n",i2c_data.msgs[1].buf[0]);
*buf = i2c_data.msgs[].buf[];
free((i2c_data.msgs[]).buf);
free((i2c_data.msgs[]).buf);
free(i2c_data.msgs);
return ret;
}
/**********************************************************************************
* 函数说明:
* 从i2c设备读数据,读一串字节
* 参数说明:
* 1. fd: 文件描述符
* 2. addr: i2c设备地址
* 3. offset: i2c设备内寄存器偏移地址
* 4. buf: 保存从i2c设备读出数据的字节数组指针
* 5. count: 要读的字节个数
* 返回值:
* 正常返回0,如果出错,返回错误码
**********************************************************************************/
int i2c_data_read_str (int fd, int addr, int offset, unsigned char *buf, int count) {
int ret;
struct i2c_rdwr_ioctl_data i2c_data;
i2c_data.nmsgs = ;
i2c_data.msgs = (struct i2c_msg*)malloc(i2c_data.nmsgs*sizeof(struct i2c_msg));
if(!i2c_data.msgs) {
perror("i2c_data_read_byte functionmalloc error");
exit();
}
ioctl(fd, I2C_TIMEOUT, ); /*超时时间*/
ioctl(fd, I2C_RETRIES, ); /*重复次数*/
(i2c_data.msgs[]).len = ; //i2c 目标数据的地址
(i2c_data.msgs[]).addr = addr; // i2c 设备地址
(i2c_data.msgs[]).flags = ; //write
(i2c_data.msgs[]).buf = (unsigned char*)malloc();
(i2c_data.msgs[]).buf[] = offset; //i2c 数据地址
(i2c_data.msgs[]).len = count; //读出的数据
(i2c_data.msgs[]).addr = addr; // i2c 设备地址
(i2c_data.msgs[]).flags = I2C_M_RD; //read
(i2c_data.msgs[]).buf = buf; //存放返回值的地址。
ret = ioctl(fd, I2C_RDWR, (unsigned long)&i2c_data);
if(ret<) {
perror("i2c_data_read_byte ioctl error.\n");
return ret;
}
//buf[count] = 0;
//printf("buf = %s\n", buf);
free((i2c_data.msgs[]).buf);
free(i2c_data.msgs);
return ;
}
四、cat i2c_data.h
/**************************************************************************************
* 声明:
* 这个函数库主要用于读写i2c设备,提供了以下功能:
* 1. 读一串字节:i2c_data_read_str()
* 2. 读一个字节:i2c_data_read_byte()
* 3. 写一串字节:i2c_data_write_str()
* 4. 写一个字节:i2c_data_write_byte()
*
*
* write by zengjf 2015-4-28
**************************************************************************************/
#ifndef __I2C_DATA_H__
#define __I2C_DATA_H__
#define array_size(array_buffer) (sizeof(array_buffer)/sizeof(*array_buffer))
/**********************************************************************************
* 函数说明:
* 往i2c设备写数据,写一串字节
* 参数说明:
* 1. fd: 文件描述符
* 2. addr: i2c设备地址
* 3. offset: i2c设备内寄存器偏移地址
* 4. buf: 字节数组
* 5. count: 字节数组长度
* 返回值:
* 正常返回写入的个数,如果出错,返回错误码
*********************************************************************************/
int i2c_data_write_str (int fd, int addr, int offset, unsigned char *buf, int count);
/**********************************************************************************
* 函数说明:
* 从i2c设备读数据,读一串字节
* 参数说明:
* 1. fd: 文件描述符
* 2. addr: i2c设备地址
* 3. offset: i2c设备内寄存器偏移地址
* 4. buf: 保存从i2c设备读出数据的字节数组指针
* 5. count: 要读的字节个数
* 返回值:
* 正常返回0,如果出错,返回错误码
**********************************************************************************/
int i2c_data_read_str (int fd, int addr, int offset, unsigned char *buf, int count);
/**********************************************************************************
* 函数说明:
* 往i2c设备写数据,写一个字节
* 参数说明:
* 1. fd: 文件描述符
* 2. addr: i2c设备地址
* 3. offset: i2c设备内寄存器偏移地址
* 4. buf: 要写入的字节
* 返回值:
* 正常返回0,出错,返回错误码;
**********************************************************************************/
int i2c_data_write_byte (int fd, int addr, int offset, unsigned char buf);
/**********************************************************************************
* 函数说明:
* 从i2c设备读数据,读一个字节
* 参数说明:
* 1. fd: 文件描述符
* 2. addr: i2c设备地址
* 3. offset: i2c设备内寄存器偏移地址
* 4. buf: 保存读出的字节指针
* 返回值:
* 正常返回0,出错,返回错误码;
**********************************************************************************/
int i2c_data_read_byte (int fd, int addr, int offset, unsigned char *buf);
#endif //__I2C_DATA_H__
五、cat Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := linuxTest
LOCAL_SRC_FILES := linuxTest.c i2c_data.c
include $(BUILD_EXECUTABLE)
I.MX6 I2C DS1337 disable square-wave output的更多相关文章
- RFID 读写器 Reader Writer Cloner
RFID读写器的工作原理 RFID的数据采集以读写器为主导,RFID读写器是一种通过无线通信,实现对标签识别和内存数据的读出和写入操作的装置. 读写器又称为阅读器或读头(Reader).查询器(Int ...
- RFID Reader 线路图收集
This 125 kHz RFID reader http://www.serasidis.gr/circuits/RFID_reader/125kHz_RFID_reader.htm http:// ...
- linux时钟管理
ref https://access.redhat.com/solutions/18627 在el5中 如何查看系统现在使用的clock source是什么? 答: 方式1:需要说明的是不能保证这个两 ...
- RTC(x86)
RTC 原创,转载请写明出处. 一直以来想写一篇关于RTC的总结,可是人太懒,在读完John Z. Sonmez大伽的<软技能代码之外的生存技能>后,终于下定决心,完成这项早已计划中的任务 ...
- POJ 2362:Square 觉得这才算深度搜索
Square Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 21821 Accepted: 7624 Descripti ...
- HDU1518 Square(DFS,剪枝是关键呀)
Square Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submi ...
- HDU1518 Square(DFS)
Square Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- HDOJ 1518 Square
Square Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- Square
Square TimeLimit: 1 Second MemoryLimit: 32 Megabyte Totalsubmit: 1638 Accepted: 440 Description ...
随机推荐
- JS输出表格头上的文字内容
Array.from(document.querySelectorAll("#tb1 tr .cell")).map(it=>it.innerText)
- [BZOJ1584]Cleaning Up 打扫卫生
Description 有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000.现在Farmer John要把这些奶牛分成若干段,定义每段的 ...
- iOS开发进阶 - 自定义UICollectionViewLayout实现瀑布流布局
移动端访问不佳,请访问我的个人博客 最近项目中需要用到瀑布流的效果,但是用UICollectionViewFlowLayout又达不到效果,自己动手写了一个瀑布流的layout,下面是我的心路路程 先 ...
- PyTorch源码解读之torchvision.models(转)
原文地址:https://blog.csdn.net/u014380165/article/details/79119664 PyTorch框架中有一个非常重要且好用的包:torchvision,该包 ...
- .aspx页面 引用命名空间 (Import 指令,web.config)
单个页面 要引用其他命名空间,在页面中写: < %@ import namespace="system.text" %> 注:即可,需要引用多个命名空间,不能写多个na ...
- String类自带的字符串处理原生方法
一.取出指定索引的字符 —— 使用charAt()方法 二.字符串与字符数组的转换 三.字符串转大写.先转换成数组,然后再改变ASCII码 四.给定一个字符串,要求判断其是否由数字组成 五.字符串与字 ...
- GTS--阿里巴巴分布式事务全新解决方案
现代IT应用中,服务化SOA作为主流的技术架构被广泛应用到各种信息系统.原来一个系统被分拆成若干个服务的集合,产生了跨服务调用的分布式事务问题.随着Dubbo.SpringCloud等微服务框架的流行 ...
- [spring]xml配置文件中bean属性的两种写法(p:configLocation <=> <property name="configLocation"/>)
1.当作bean节点的属性:p:configLocation: <!-- mybatis文件配置,扫描所有mapper文件 --> <bean id="sqlSession ...
- 你曾后悔进入 IT 行业吗?为什么?(转自知乎)--一生不悔入IT
你曾后悔进入 IT 行业吗?为什么?(转自知乎)--一生不悔入IT 一.总结 一句话总结:看了大概200条评论,99%的不后悔,大部分人后悔没有早点干,但是做it最最主要的是要注意身体. 1.it是最 ...
- Apache的三种工作模式及相关配置
Apache的三种工作模式 作为老牌服务器,Apache仍在不断地发展,就目前来说,它一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块).它们分别是 prefor ...