关于CC2541的硬件I2C

  1. TI的hal库已经写好了相关的驱动,不需要自己硬着头皮去看数据手册了,hal_i2c.c文件存放路径是:C:\Texas Instruments\BLE-CC254x-1.4.2.2\Components\hal\target\CC2541ARC,这个文件夹里的hal_i2c.c包含了主和从的驱动。
  2. 硬件I2C只有CC2541才具备,CC2540用usb控制器取代了I2C。
  3. hal_i2c.h头默认初始化的是slave,需要在宏定义里把HAL_I2C_MASTER改为TRUE
#if !defined HAL_I2C_MASTER
#define HAL_I2C_MASTER  FALSE
#endif#if !defined HAL_I2C_SLAVE
#if HAL_I2C_MASTER
#define HAL_I2C_SLAVE   FALSE
#else
#define HAL_I2C_SLAVE   TRUE
#endif
#endif
  1. 工程的预处理器需要添加HAL_I2C=TRUE,编译的时候需要这个宏,不加也行,把头里无关宏删除干净就行。
  2. 初始化为master设备时不需要写地址寄存器I2CADDR,这是从设备或者多主机时候才用的,无需理会。因此初始化函数只需要传入时钟参数。
HalI2CInit(i2cClock_267KHZ);
  1. 读函数说明,应答是由硬件自动控制的,库函数仅实现了从零地址寄存器开始读取的方法——START、写器件地址|方向读、写buffer数据、STOP。无法完成指定寄存器地址读取,需要自己实现。
i2cLen_t HalI2CRead(uint8 address, i2cLen_t len, uint8 *pBuf)
  1. 写函数说明,由于写需要指定明确的寄存器地址,需要先将目的寄存器地址先添加到pBuf的第0个元素中,之后跟需要写入的内容即可。
i2cLen_t HalI2CWrite(uint8 address, i2cLen_t len, uint8 *pBuf)

填坑

  1. CC2541的I2C和P2口公用一个中断号,只要你使能了P2的中断使能位,当I2C触发中断时就会跳转到P2的中断服务函数中去,在系统设计的时候需要考虑是否有P2口的引脚需要用到中断功能。
  2. I2C的配置和状态在PM2和PM3模式下是不保存的,退出睡眠模式后需要重新配置一次。也就是说,只要你的IAR预处理器里开启了POWER_SAVING这个宏,CC2541就会在没有任务的时候去睡觉,一睡醒就忘记有I2C这回事了,这时候你要是直接调用了HalI2CRead或HalI2CWrite,那么不好意思,你的代码肯定会死在发送START上。所以要么关上xPOWER_SAVING,要么在进行操作I2C之前都加一句HalI2CInit。

正文

写点SD3078的驱动凑字数,SD3078精度很高一年下来基本也就差个2-3分钟的样子。
I2C的库函数就不贴了,改了点宏,其他都没动过,初始化也很简单,不需要修改,配个时钟就行了。
下面是是SD3078的简单驱动,实现了寄存器地址0x00-0x07的读和写,也就是最常用到的日历寄存器部分。

#include "hal_mcu.h"
#include "hal_defs.h"
#include "hal_types.h"
#include "hal_drivers.h"
#include "hal_timer.h"
#include "osal.h"
#include "hal_i2c.h"
#include "sd3078.h"void SD3078_Init(void)
{HalI2CInit(i2cClock_267KHZ);
}void WriteTimeOn(void)
{uint8 ctr2[2] = { CTR2, 0x80 };uint8 ctr1[2] = { CTR1, 0xFF };HalI2CWrite(RTC_Address, 2, ctr2);HalI2CWrite(RTC_Address, 2, ctr1);
}void WriteTimeOff(void)
{uint8 ctr2[2] = { CTR2, 0x00 };uint8 ctr1[2] = { CTR1, 0x7b };HalI2CWrite(RTC_Address, 2, ctr1);HalI2CWrite(RTC_Address, 2, ctr2);
}uint8 SD3078_ReadDate(Time_Def *psRTC)
{return HalI2CRead(RTC_Address, sizeof(Time_Def), (uint8 *)psRTC);
}uint8 SD3078_WriteDate(Time_Def  *SetRTC)
{uint8 buffer[8];uint8 i;buffer[0] = 0x00;//begain write form reg 0x00osal_memcpy((uint8 *)&buffer[1], (uint8 *)SetRTC, sizeof(Time_Def));WriteTimeOn();//turn off write-protecti = HalI2CWrite(RTC_Address, sizeof(Time_Def)+1, buffer);WriteTimeOff();//turn on write-protectreturn i;
}

总结

CC2541的硬件I2C挺好用的。

11月21日 与田里

CC2541硬件I2C驱动SD3078填坑指南相关推荐

  1. Android Studio 填坑指南

    前几天发布了一篇名为<Android Studio 安装.配置及第一个程序演示>的博文,有不少童鞋都认真阅读过并照步骤一步一步操作了一遍,有滴如期成功地装好了,然鹅有滴反映说这不对呀,为森 ...

  2. 开发工具总结(2)之全面总结Android Studio2.X的填坑指南

    前言:好多 Android 开发者都在说Android Studio太坑了,老是出错,导致开发进度变慢,出错了又不知道怎么办,网上去查各种解决方案五花八门,有些可以解决问题,有些就是转来转去的写的很粗 ...

  3. Redmine3.3.3 搭建与不完全填坑指南

    为什么80%的码农都做不了架构师?>>>    Redmine3.3.3 搭建与不完全填坑指南 [TOC] 概要 Redmine3.3.3 搭建.不完全填坑指南.不联网安装.Wind ...

  4. 开发工具总结(4)之Android Studio3.0填坑指南

    序言 Android Studio 3.0 上篇讲了: 全面总结Android Studio2.X的填坑指南 这篇讲一下AS3.0的坑.. 作为这个世界上走在最前沿的生物"猿",怎 ...

  5. 第二篇:salt-api使用填坑指南

    前言 salt-api在使用时,有些坑欲哭无泪,一路趟雷过后,总结了一趟salt-pai使用填坑指南,保君一路畅通. salt-api 安装 #本文的安装版本 2018.3.2-1.el6 yum i ...

  6. alert点击确定后跳转_公众号/h5 跳转到小程序填坑指南

    公众号/h5 跳转到小程序填坑指南 本文介绍的是使用微信开放标签 wx-open-launch-weapp 实现微信浏览器内网页跳转到任意合法合规的小程序里,官方要求微信版本为:7.0.12 及以上, ...

  7. MSP430G2553 Launchpad 硬件I2C驱动

    一.USCI I2C 驱动介绍 对于MSP430G2553,硬件I2C由外设USCI(Universal Serial Communication Interface)提供.USCI又分为USCI_A ...

  8. KKBOX音乐——数据分析,用户研究与填坑指南

    KKBOX音乐--数据分析,用户研究与填坑指南 导语 1 数据来源 2 数据处理 2.1 录入数据 2.2 数据类型 3 探索性分析 3.1 MySQL+Excel 3.1.1 每年3月最先注册的前1 ...

  9. NW.JS填坑指南(解决Flash插件、视频播放等故障)

    目录 NW.JS填坑指南 NW.js是什么? NW.js 和 electron的选择 开发工具IDE 下载nwjs 版本信息 简单的实例 改图标 改合成exe的图标 改图标第二种方案是 播放不了视频 ...

最新文章

  1. SAP PP COR2下达工单系统报错说-系统状态APNG是激活的- 分析第二篇
  2. ccnp bcmsn 高级交换学习笔记2
  3. 在eclipse中安装properties插件PropertiesEditor及设置(附图),ASCII码转换成中文
  4. CIDR地址块及其子网划分
  5. oracle 叠加代码写法,利用st_geometry进行图形叠加分析
  6. C和指针之高级指针话题通过函数指针实现在链表中找到特定的值
  7. python函数调用时所提供的参数可以是变量吗_Python函数一章,关于变量参数调用(何时使用*)记录,pytho,章节,可变,的,什么,时候...
  8. 零基础想学Python,明白这2点,越快年薪30W
  9. 非常有名的免费开源图库相册软件
  10. [GO]结构体成员的使用:普通变量
  11. 什么是语义化的HTML?有何意义?为什么要做到语义化?
  12. junit 生成html报告,gradle – 如何为JUnit 5测试创建HTML报告?
  13. php7.1.1一键安装/配置文件简单优化
  14. JavaSE基础———StringBuffer StringBuilder Arrays和基本数据类型包装类
  15. python输出unicode对应字符_python unicode字符串
  16. 《工程电磁场(第三版)》(倪光正 主编)复习
  17. 郑君里 信号与系统,傅里叶级数,逼近函数仿真,吉布斯验证
  18. ajax响应速度慢,jQuery Ajax请求的响应速度变化
  19. MySQL免安装版本的下载/配置/连接DBeaver---详细教程
  20. 美光称对华为恢复部分芯片出货 股价一度上涨10%

热门文章

  1. 使用Python抓取婚恋网数据并用决策树生成择偶观
  2. SecureFile 和 DBFS
  3. u盘运行linux失败,u盘安装linux失败的解决方法
  4. 解决AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using local
  5. Unity官方案例学习——游戏设计理念(游戏的灵魂)
  6. html 绘制甘特图,echarts绘制甘特图
  7. moments此服务器的证书无效,群晖NAS相册的正确玩法!使用Moments的朋友必看!强烈推荐搭配DS Photo使用!...
  8. 使用PHP搭建自己的MVC框架
  9. c语言 ascii 和 压缩bcd 码之间的相互转换
  10. 第7讲、OrCAD页连接符的使用以及电源电路等绘制