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 ...
随机推荐
- 翻翻git之---丰富多样的路由跳转开源库 ARouter
转载请注明出处:王亟亟的大牛之路 有一段时间没更新博客了,最近也没学什么新东西,正好组里小伙在做路由跳转的一个"公共库",然后正好最近这样的轮子不少,我也就跟着看看,学习一下人家的 ...
- 从零开始玩转JMX(二)——Condition
Notification 一个MBean提供的管理接口允许代理对其管理资源进行控制和配置.然而,对管理复杂的分布式系统来说,这些接口知识提供了一部分功能.通常,管理应用程序需要对状态变化或者当特别情况 ...
- PLMN和PSTN
一.PLMNPLMN公众陆地移动电话网(PLMN) public land mobile network 由政府或它所批准的经营者,为公众提供陆地移动通信业务目的而建立和经营的网路.该网路必须与公众交 ...
- sass快速入门 - 笔记
一.使用变量 1.使用$符号来标识变量. 例: $nav-color:#F90; .nav{ $width:100px; width:$width; color:$nav-color; }
- RotateCard(自定义旋转view)
使用方法Demo package com.example.displaydemo; import java.util.ArrayList; import com.example.displaydemo ...
- angular2中的路由转场动效
1.为什么有的人路由转动效离场动效不生效? 自己研究发现是加动效的位置放错了 如下: <---! animate-state.component.html --> <div sty ...
- DML,DML,DCL,DQL
可以先看看这篇微博:http://blog.csdn.net/jiben2qingshan/article/details/7832344 http://blog.163.com/chenwenlin ...
- IE8下使用asp.net core mvc+jquery ajaxSubmit问题
由于项目中一些特殊的地方使用了ajaxSubmit提交数据,但发现在IE8中出现问题,使用该方式提交数据后,无法返回提交结果,而是直接下载该方法名的一个文件,翻阅了园子,终于找到了最简单的解决办法,特 ...
- SPOJ BALNUM ★(位压缩状态+数位DP)
题意 求区间[A,B]上的平衡数个数.平衡数是这样的数:在数的各个位上,奇数数字出现偶数次,偶数数字出现奇数次. 思路 很明显我们需要记录每一位出现的次数.分别记录是不明智的,而我们又只需要记录奇数次 ...
- c# Middleware impl
using NUnit.Framework; using System; using System.Collections.Generic; using System.Linq; using Syst ...