瑞萨单片机-硬件I2C从设备
开发环境
1、e2 studio
2、R5F1115AxFL
概述
1、网上关于I2C从机的资料很少,在这里分享下我在瑞萨单片机上实现I2C从机,根据主机发来的数据,从机返回或者保存数据
2、R5F1115AxFL最多支持3个从设备地址(即可以作为三个从设备)
3、从接收模式:直接将数据保存到RAM中,接收完再处理
4、从发送模式:按照I2C读取传感器数据经验,主机读取从设备时,从设备需要立刻返回数据的,但是程序要如何实现一收到指令就返回特定的数据?(时钟拉伸)这里先跳过,我们先实现返回固定的数据。
配置
选择I2C从模式,生成代码后,我们把生成的中断处理函数给屏蔽掉,自己另外实现这些中断函数
从接收模式
1、工作流程
(1)从模式下,I2C会处于待机模式,直到地址检测到匹配
(2)当地址匹配时会在第九个时钟周期的上升沿将ICSR1.HOA, GCA和AASy
(y = 0 to 2)置1。AASy就是对应那个从设备地址匹配,根据这个位我就就可以做多从设备的识别了
(3)后面就不说了,自己看手册
从发送模式
重写I2C相关的中断函数
1、错误中断处理函数。处理起始条件中断、停止条件中断等
static void r_Config_RIIC0_error_interrupt(void)
{volatile uint8_t dummy;if ((1U == RIIC0.ICIER.BIT.ALIE) && (1U == RIIC0.ICSR2.BIT.AL)){}else if ((1U == RIIC0.ICIER.BIT.TMOIE) && (1U == RIIC0.ICSR2.BIT.TMOF)){//超时中断处理}else if ((1U == RIIC0.ICIER.BIT.NAKIE) && (1U == RIIC0.ICSR2.BIT.NACKF)){//NACK中断处理dummy = RIIC0.ICDRR;while (1U != RIIC0.ICSR2.BIT.STOP){nop();}RIIC0.ICSR2.BIT.NACKF = 0U;RIIC0.ICSR2.BIT.STOP = 0U;i2c_drv[i2c_dev.id].tx_cnt = 0;}else if (1U == RIIC0.ICSR2.BIT.STOP) /* detect stop condition */{/*After the ICSR2.STOP flag is confirmed to be 0 and the ICSR2.RDRF flag to be 1, dummy read the ICDRR register*/if (1 == RIIC0.ICSR2.BIT.RDRF)dummy = RIIC0.ICDRR;/*After checking that the ICSR2.STOP flag is 1, set the ICSR2.STOP flag to 0 for the next transfer operation*/RIIC0.ICSR2.BIT.NACKF = 0U;RIIC0.ICSR2.BIT.STOP = 0U;/*接收完成*///i2c_drv[i2c_dev.id].rx_len = i2c_drv[i2c_dev.id].rx_cnt;//i2c_drv[i2c_dev.id].rx_cnt = 0;//i2c_dev.dummy = 0;}else{if (1U == RIIC0.ICSR2.BIT.START) /* detect start condition */{RIIC0.ICSR2.BIT.START = 0;//i2c_dev.dummy = 0;while( 0 == RIIC0.ICSR2.BIT.RDRF)//等待第九个时钟中期到{nop();}/*判断是哪个从设备和主机通信根据标志决定将接收的数据保存到哪个缓冲区,或者将哪个缓存的数据发送出去*/if(1 == RIIC0.ICSR1.BIT.GCA || 1 == RIIC0.ICSR1.BIT.AAS0){//从设备匹配0}else if(1 == RIIC0.ICSR1.BIT.AAS1){//从设备匹配1}else if(1 == RIIC0.ICSR1.BIT.AAS2){//从设备匹配2}i2c_dev.model = RIIC0.ICCR2.BIT.TRS;// 从设备处于发送还是接收模式}}
}
2、发送中断
static void r_Config_RIIC0_transmit_interrupt(void)
{if(I2C_MODEL_TX == RIIC0.ICCR2.BIT.TRS)//发送模式{if(1 ==RIIC0.ICSR2.BIT.TDRE)//发送中断标志{//根据匹配地址决定将哪个缓冲区数据发送出去//RIIC0.ICDRT = i2c_drv[i2c_dev.id].pTbuf[i2c_drv[i2c_dev.id].tx_cnt];//i2c_drv[i2c_dev.id].tx_cnt++;}}
}static void r_Config_RIIC0_transmitend_interrupt(void)
{volatile uint8_t dummy;//if(I2C_MODEL_TX == i2c_dev.model){/* Dummy read to release SCL */dummy = RIIC0.ICDRR;}
}
3、接收中断
static void r_Config_RIIC0_receive_interrupt(void)
{uint8_t dummy;if(I2C_MODEL_RX == RIIC0.ICCR2.BIT.TRS){if (0 == i2c_dev.dummy){dummy = RIIC0.ICDRR;//i2c设备地址i2c_dev.dummy = 1;return;}RIIC0.ICMR3.BIT.ACKWP = 1U;RIIC0.ICMR3.BIT.ACKBT = 0U;//保存数据//i2c_drv[i2c_dev.id].pRbuf[i2c_drv[i2c_dev.id].rx_cnt] = RIIC0.ICDRR;//i2c_drv[i2c_dev.id].rx_cnt++;}else{dummy = RIIC0.ICDRR;}
}
clock strech时钟拉伸
参考网址https://blog.csdn.net/happygaohualei/article/details/52864694
在发送数据模式下,从设备可能还来不及准备数据,这时候就需要时钟拉伸,等数据准备好后再释放,让主机能继续接收数据(主机支持时钟拉伸功能)
瑞萨单片机-硬件I2C从设备相关推荐
- 瑞萨单片机及其开发环境
本内容介绍瑞萨单片机硬件及其开发环境搭建,仿真的使用.紫色文字是超链接,点击自动跳转至相关博文.持续更新,原创不易! 目录: 一.瑞萨单片机 二.开发环境 1.中文注释 2.变量搜索 3.跳转到相应的 ...
- 瑞萨单片机 (R5F100LE) I2C IIC 电子指南针模块 HMC5883L
2019独角兽企业重金招聘Python工程师标准>>> 电子指南针模块在智能车和飞行器上是很常用的模块,这篇文章就介绍一下瑞萨单片机如何使用HMC5883L,HMC5883L使用I2 ...
- 33、基于CACX和R7F0C004M的瑞萨单片机入门教程
代码资源下载:https://download.csdn.net/download/BaoTTing/58444918 一.开发环境介绍 CS+ for CACX: 瑞萨单片机开发环境,已经停止更新, ...
- 瑞萨单片机之电压检测器(低压复位)(六)
目录 一.电压检测器的作用 二.电压检测器如何使用 一.电压检测器的作用 顾名思义,电压检测器就是用来检测电压的,电压检测器将检测到的电压与电源电压进行比较,比较完成后执行相应的动作:复位.复位&am ...
- 瑞萨单片机iap串口升级boot程序与app程序合并的工程构建-学习记录
MCU型号: R7F0C004 编辑软件:CS+ for CC boot区程序地址分配:0x0000-0x1ffff app区程序地址分配: 0x2000-0xfffff 复制一份常规的app程序,然 ...
- 瑞萨单片机C语言,瑞萨单片机学习笔记(1)基本配置
根据自己的芯片家族选择不同的代码编辑工具及仿真工具 对应78K0系列单片机,推荐的是cubeSuite+集成开发环境,具体使用可以看帮助手册. 有接触过PIC.STC的单片机,瑞萨单片机有其独特的地方 ...
- 瑞萨单片机c语言程序,瑞萨单片机开发环境系统用户手册.pdf
RCC10J0005-0100 M16C R8C FOUSB/UART软件 用户手册 瑞萨单片机开发环境系统 Rev.1.00 发行:2006年10月27日 Keep safety first in ...
- STC8系列单片机硬件I2C使用教程(二)
硬件I2C(中断方式)以STC8F2K08S2单片机为例 一.I2C相关的寄存器 二.I2C中断相关的寄存器 ① I2C中断源 ② I2C中断允许位 ③ I2C中断标志位 三.程序编写 ① 寄存器和相 ...
- 瑞萨单片机之开发环境的搭建(一)
目录 一.开发环境搭建 二.开发环境界面设置 三.新建一个demo 四.软件使用(使用发现的功能及坑) 4.1 编译代码后显示当前程序大小 4.2.代码缩进 4.3 代码屏蔽 瑞萨单片机开发环境有三种 ...
最新文章
- Python第三方库jieba(中文分词)入门与进阶(官方文档)
- creator cc.Class跨脚本访问(小白笔记)
- lucene索引文件格式
- POJ1321 棋盘问题
- JQuery 判断checkbox是否选中,checkbox全选,获取checkbox选中值
- 39、JAVA_WEB开发基础之ajax和json
- VS.NET提示试图运行项目时出错:无法启动调试。绑定句柄无效解决办法
- 显式(静态)调用: LIB + DLL + .H
- 国货彩妆品牌2021年Q1社媒营销投放分析报告
- 学python适合什么年龄段的人用_7个现在就该学习Python 的理由【80%的人都不知道】...
- python分割合并文件
- 等额本息excel模板下载_格格技能——巧用EXCEL函数,算清各种收益利率
- 链表(创建,插入,删除和打印输出
- 拒绝空谈 AI 设想!手把手教你构建实时、高可用的 AI 调度平台
- 疑难杂症篇(一)--安装Visio与已安装的office冲突的解决方案
- Web 实现登录记住密码功能
- CMOS Image Sensor的DVP接口硬件设计
- 8queen(稍后补)
- FinTech4Good创始人张晓晨:全球区块链的产业应用趋势
- 2021年韩国经济发展研究报告
热门文章
- Date Interoperability:Module ‘ACAD‘ is not licensed for use with this FME edition
- UE4制作多语言游戏(本地化功能详解)
- Kotlin 1.4 和未来值得期待的地方
- 墙面有几种装修方法_墙面怎么装?四种装修方式总有一款适合你
- 放大电路中的自激震荡及相位补偿方法
- 七款简单易用的项目管理平台
- 设置 IDEA走easyconnect代理
- DLL简述,很有意思
- 通过 irp 请求包删除文件
- 京训钉怎么快速看完_阿里(钉钉部门)远程面,三面坐上“直通车”,拿下offer没问题...