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 ...
随机推荐
- SVN错误:Failed to load JavaHL Library
环境:jdk1.7(64bit),eclipse4.4(64bit),SVN1.10.3 问题:在利用subclipse同步资源时,报出错误提示 Failed to load JavaHL Libra ...
- windows批量删除ip
cmd下输入如下命令第一步:netsh -c int ip dump >c:\ip.txt在C盘根目录看到一个ip.txt的文件,内容为当前网卡的设置信息,为了能更直观的看清楚IP的设置信息. ...
- java计算两个日期之间相隔的月份(向下取整)
最近需求里面有个需要计算两个日期之间相隔的月份,写起来还挺繁琐,需要将各种情况都要考虑到,写了一个作为以后自己的工具吧. //获取哪一天 public static int getDay(Date d ...
- nmap 端口扫描王,查看端口是否可访问,是否对外开放
NMap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包. 1 安装 apt-get install nmap 2 使用,查看ip下所有对外的端口 $ sudo nmap ...
- 【Linux】结合Python 简易实现监控公司网站,邮件发送异常
背景 由于一些原因,博主负责测试的网站的服务器切换到了香港,切换后出现了多次访问超时的情况 于是主动请缨写一个自动监测的脚本,本来准备完全使用shell来写,后来发现shell发送邮件只能在测试机之间 ...
- Js上下左右无缝隙滚动代码
转载:http://www.cnblogs.com/chenjt/p/4193464.html 主要用到dom.offsetWidth 这个表示实际的宽度. dom.scrollLeft 这个表示这个 ...
- 《Think in Java》(十七)容器深入研究
阿西吧,这一章好长啊,感觉看了快一个月了吧!JDK 自带的容器框架真是很好很强大啊,这一章看得有点蒙蒙的,接下来还得去看看官方文档啊!
- 4.彻底理解synchronized
1. synchronized简介 在学习知识前,我们先来看一个现象: public class SynchronizedDemo implements Runnable { private s ...
- HDU 4099 大数+Trie
Revenge of Fibonacci Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 204800/204800 K (Java/ ...
- KMP算法(改进后的字符串匹配算法)
转载:http://blog.csdn.net/liu88010988/article/details/50789960 kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O ...