一、 简介

1、关于中断
能触发的中断事件只有两个:

  • a、I2C中断
  • b、I2C FIFO中断
    其中I2C中断包括:
  • 发送数据就绪
  • 接收数据就绪
  • 寄存器访问就绪
  • 接收到NACK
  • 仲裁了(仲裁只有在一个数据总线上接了多个主机时才有用)
  • 停止位检测
  • 从机地址
    其中I2C FIFO中断包括
  • 发送FIFO中断
  • 接收FIFO中断

2、关于传输模式

传输模式也是有两种:

  • 标准模式:准备发送n个数据值,其中n是您在I2C模块寄存器中编程的值。主要依赖I2CCNT寄存器配置
  • 重复模式:继续发送数据值,直到您使用软件启动停止条件或新的启动条件。主要依赖于I2CMDR寄存器配置

3、关于I2C模块

主要由10个部分组成:

  • a、串行接口:一个数据引脚(SDA),一个时钟引脚(SCL)
  • b、数据寄存器和FIFO,用于临时保存SDA引脚和CPU之间的接收数据和传输数据
  • c、控制和状态寄存器
  • d、外围总线接口,使CPU能够访问I2C模块寄存器和FIFO
  • e、时钟同步器,用于同步I2C输入时钟(来自设备时钟发生器)和SCL引脚上的时钟,并与不同时钟速度的主机同步数据传输
  • f、一个预分频器:用于划分驱动至I2C模块的输入时钟
  • g、SDA和SCL两个引脚上各有一个噪声滤波器
  • h、仲裁器:用于处理I2C模块(主机模式)和另一个主模块之间仲裁
  • I、中断生成逻辑:以便向CPU发送中断
  • j、FIFO中断生成逻辑:以便FIFO访问可以与I2C模块中的数据接收和数据传输同步

二、数据传输流程

非FIFO模式下
CPU将用于传输的数据写入I2CDXR,并从I2CDRR读取接收到的数据。
将I2C模块配置为发送器时,写入I2CDXR的数据将复制到I2CXSR,并在SDA引脚上一次移出一位。

I2C_setConfig(I2CA_BASE, I2C_MASTER_SEND_MODE);//配置为发送模式

当I2C模块被配置为接收器时,接收到的数据被转移到I2CRSR,然后复制到I2CDRR

I2C_setConfig(I2CA_BASE, I2C_MASTER_RECEIVE_MODE);//配置为接收模式

时钟生成:

为了满足所有的12C协议定时规格,12C模块的时钟必须在7- 12mhz之间。


只有当I2C模块处于复位状态(I2CMDR中的IRS=0)时,才能初始化预分频器。
只有当IRS更改为1时,预定频率才生效。
•I2CCLKL中的ICCL。对于每个主时钟周期,ICCL确定信号低的时间量。
•I2CCKLH中的ICCH。对于每个主时钟周期,ICCH确定信号高电平的时间量。

//对应代码最后一部分I2C_DUTYCYCLE_50可以使SCL的占空比为50%或者33%
I2C_initMaster(I2CA_BASE, DEVICE_SYSCLK_FREQ, 10000, I2C_DUTYCYCLE_50);

引脚配置:
先配置GPyGMUX,配置GPxQSELn为异步模式,配置GPyPUD为内部上拉模式

GPIO_setDirectionMode(DEVICE_GPIO_PIN_SDAA, GPIO_DIR_MODE_OUT);//GPIO_DIR_MODE_IN
GPIO_setPadConfig(DEVICE_GPIO_PIN_SDAA, GPIO_PIN_TYPE_STD);//GPIO_PIN_TYPE_PULLUP
GPIO_setQualificationMode(DEVICE_GPIO_PIN_SDAA, GPIO_QUAL_ASYNC);//异步GPIO_setDirectionMode(DEVICE_GPIO_PIN_SCLA, GPIO_DIR_MODE_OUT);//GPIO_DIR_MODE_IN
GPIO_setPadConfig(DEVICE_GPIO_PIN_SCLA, GPIO_PIN_TYPE_STD);//GPIO_PIN_TYPE_PULLUP
GPIO_setQualificationMode(DEVICE_GPIO_PIN_SCLA, GPIO_QUAL_ASYNC);//异步GPIO_setPinConfig(DEVICE_GPIO_CFG_SDAA);
GPIO_setPinConfig(DEVICE_GPIO_CFG_SCLA);

三、I2C模块操作详情

I2C模块有四种基本工作模式:

工作模式 描述
从机接收模式 I2C模块是从模块,从主模块接收数据。所有从机在此模式下开始。在此模式下,SDA上接收的串行数据位随主设备产生的时钟脉冲移入。作为从机,I2C模块不生成时钟信号,但在接收字节后需要设备干预(I2CSTR中的RSFULL=1)时,它可以将SCL保持在低位。
从机发送模式 I2C模块为从模块,向主模块传输数据。该模式只能从从接收器模式进入;I2C模块必须首先接收来自主机的命令。当您使用任何7位/10位寻址格式时,如果从机地址字节与其自身地址(在I2COAR中)相同,且主机已传输R/W=1,则I2C模块将进入其从机发送器模式。作为从发送器,I2C模块随后利用主发送器产生的时钟脉冲将SDA上的串行数据移出。作为从机,I2C模块不生成时钟信号,但在发送字节后需要设备干预(I2CSTR中的XSMT=0)时,它可以将SCL保持在低位。
主机接收模式 I2C模块是一个主模块,从一个从模块接收数据。该模式只能从主变送器模式进入;I2C模块必须首先向从机发送命令。当您使用任何7位/10位寻址格式时,I2C模块在传输从属地址字节且R/W=1后进入其主接收器模式。SDA上的串行数据位随SCL上I2C模块产生的时钟脉冲移入I2C模块。当接收到字节后需要设备干预(I2CSTR中的RSFULL=1)时,时钟脉冲被抑制,SCL保持低。
主机发送模式 I2C模块是一个主模块,将控制信息和数据传输到从模块。所有母版都在此模式下开始。在此模式下,以任何7位/10位寻址格式组合的数据在SDA上移出。位移位与SCL上I2C模块产生的时钟脉冲同步。在发送一个字节后,当需要设备干预(I2CSTR中的XSMT=0)时,时钟脉冲被抑制,SCL保持低。

起始信号和结束信号

 //刚刚配置的信息特指以下两个函数:I2C_setDataCount(I2CA_BASE,2);I2C_putData(I2CA_BASE, ADDR);//发送设备地址I2C_sendStartCondition(I2CA_BASE);//发送起始信号,并将刚刚配置的信息发送出I2C_sendStopCondition(I2CA_BASE);//发送终止信号

设置数据长度

I2C_setBitCount(I2CA_BASE, I2C_BITCOUNT_8);//配置数据长度为8位

7位地址模式

I2C_setAddressMode(I2CA_BASE,I2C_ADDR_MODE_7BITS);//设置为7位地址位寻址模式

在该模式下以CAT24C02为例

当A2 = A1 = A0 = 0时,写模式为0xA0,读模式为0xA1,但在TMS320F280049C的I2C模块不需要考虑R/W位只考虑前7位,即输入0x50即可。

     I2C_setSlaveAddress(I2CA_BASE, 0x50);

主机发送一个字节数据后自动会在数据后检测ACK信号

我看了很久官方的中断程序和中断相关的介绍= =。由于我太菜,看了个寂寞,复刻不出,网上除了官方基本没有例程(反正我没找到例程),因此我自己写了一个利用TMS320F280049C的硬件I2C读写ATC24C02的的程序(非中断)程序运行效率不高,但是吧,能用就行= =。

#define Delay_MinTime               1*1000
//  I2C PIN
#define DEVICE_GPIO_PIN_SDAA        32U  // GPIO number for I2C SDAA
#define DEVICE_GPIO_PIN_SCLA        33U  // GPIO number for I2C SCLA
#define DEVICE_GPIO_CFG_SDAA        GPIO_32_I2CA_SDA  // "pinConfig" for I2C SDAA
#define DEVICE_GPIO_CFG_SCLA        GPIO_33_I2CA_SCL  // "pinConfig" for I2C SCLA
#define SLAVE_ADDRESS               0x50
//初始化
void HAL_setupI2CA(void)
{//IO初始化GPIO_setDirectionMode(DEVICE_GPIO_PIN_SDAA, GPIO_DIR_MODE_OUT);//GPIO_DIR_MODE_INGPIO_setPadConfig(DEVICE_GPIO_PIN_SDAA, GPIO_PIN_TYPE_STD);//GPIO_PIN_TYPE_PULLUPGPIO_setQualificationMode(DEVICE_GPIO_PIN_SDAA, GPIO_QUAL_ASYNC);GPIO_setDirectionMode(DEVICE_GPIO_PIN_SCLA, GPIO_DIR_MODE_OUT);//GPIO_DIR_MODE_INGPIO_setPadConfig(DEVICE_GPIO_PIN_SCLA, GPIO_PIN_TYPE_STD);//GPIO_PIN_TYPE_PULLUPGPIO_setQualificationMode(DEVICE_GPIO_PIN_SCLA, GPIO_QUAL_ASYNC);GPIO_setPinConfig(DEVICE_GPIO_CFG_SDAA);GPIO_setPinConfig(DEVICE_GPIO_CFG_SCLA);//I2C模块初始化I2C_disableModule(I2CA_BASE);I2C_initMaster(I2CA_BASE, DEVICE_SYSCLK_FREQ, 100000, I2C_DUTYCYCLE_50);I2C_setBitCount(I2CA_BASE, I2C_BITCOUNT_8);I2C_setSlaveAddress(I2CA_BASE, SLAVE_ADDRESS);I2C_setConfig(I2CA_BASE, I2C_MASTER_SEND_MODE);I2C_setEmulationMode(I2CA_BASE, I2C_EMULATION_FREE_RUN);//中断源为:检测到停止位,寄存器访问准备就绪I2C_enableInterrupt(I2CA_BASE, I2C_INT_STOP_CONDITION | I2C_INT_REG_ACCESS_RDY);I2C_enableFIFO(I2CA_BASE);I2C_clearInterruptStatus(I2CA_BASE, I2C_INT_RXFF | I2C_INT_TXFF);I2C_enableModule(I2CA_BASE);
}
//写一个字节数据到24C02
int16_t EE24CX_Write_Byte(uint16_t ADDR,uint16_t Data)
{I2C_setDataCount(I2CA_BASE,2);I2C_putData(I2CA_BASE, ADDR);//发送需要写入的地址I2C_putData(I2CA_BASE, Data);//发送需要写入的数据I2C_setConfig(I2CA_BASE, I2C_MASTER_SEND_MODE);//设置为发送模式I2C_sendStartCondition(I2CA_BASE);//发送起始信号,并将刚刚配置的信息发送出I2C_sendStopCondition(I2CA_BASE);//发送终止信号DEVICE_DELAY_US(Delay_MinTime);return 1;
}
//读24C02指定地址的一个字节
uint16_t EE24CX_Read_Byte(unsigned char ADDR)
{uint16_t Data;I2C_setDataCount(I2CA_BASE,1);I2C_putData(I2CA_BASE, ADDR);//发送地址信息I2C_setConfig(I2CA_BASE, I2C_MASTER_SEND_MODE);//配置为发送模式I2C_sendStartCondition(I2CA_BASE);//发送起始信号DEVICE_DELAY_US(Delay_MinTime);I2C_setConfig(I2CA_BASE, I2C_MASTER_RECEIVE_MODE);//配置为接收模式I2C_sendStartCondition(I2CA_BASE);//发送起始信号DEVICE_DELAY_US(Delay_MinTime);Data = I2C_getData(I2CA_BASE);//读取数据I2C_sendNACK(I2CA_BASE);//发送NACKI2C_sendStopCondition(I2CA_BASE);//发送停止信号DEVICE_DELAY_US(Delay_MinTime);return Data;
}//写多个字节到24C02(这里没有按照按页写的时序)
//参数ADDR为读取的起始地址,*Data是发送缓存区,Number是发送的字节数
uint16_t IIC_Write_NByte(uint16_t ADDR,uint16_t *Data,uint16_t Number)
{uint16_t i = 0;for(i = 0;i < Number;i++){EE24CX_Write_Byte(ADDR+i,(*Data));Data++;}return 1;
}//从24C02读取多个字节(这个是按照规格书的多字节读取时序写的)
//参数ADDR为读取的起始地址,*Data是接收缓存区,Number是读取的字节数
uint16_t IIC_Read_NByte(uint16_t ADDR,uint16_t * Data,int16_t Number)
{uint16_t i = 0;uint16_t i_16 = 0;I2C_setDataCount(I2CA_BASE,1);I2C_putData(I2CA_BASE, ADDR);//发送地址信息I2C_setConfig(I2CA_BASE, I2C_MASTER_SEND_MODE);//配置为发送模式I2C_sendStartCondition(I2CA_BASE);//发送起始信号DEVICE_DELAY_US(Delay_MinTime);//该延时必须有否则无法读取I2C数据I2C_setDataCount(I2CA_BASE,Number);//设置需要接收的数据量I2C_setConfig(I2CA_BASE, I2C_MASTER_RECEIVE_MODE);//配置为接收模式I2C_sendStartCondition(I2CA_BASE);//发送起始信号DEVICE_DELAY_US(Delay_MinTime);//该延时必须有否则不能正确读取的I2C数据while(i < Number){i_16 = (i+1) % 16;i++;*Data = I2C_getData(I2CA_BASE);//读取数据Data++;if(i != 0 && i_16 == 0)DEVICE_DELAY_US(Delay_MinTime);//这个延时必须有,如果没有在读取的数据量超过16字节时读取时序会出错}if(i == Number){I2C_sendStopCondition(I2CA_BASE);//发送停止信号}DEVICE_DELAY_US(Delay_MinTime);return 1;
}

如果有幸想通了怎么用中断,再研究分享吧,现在水平不够,就这样吧

TMS320F280049 I2C IIC 相对于库函数操作CAT24C02 中文相关推荐

  1. 08-ioctl控制LED软件实现(库函数操作)

    从内核中最简单的驱动程序入手,描述Linux驱动开发,主要文章目录如下(持续更新中):  01 - 第一个内核模块程序  02 - 注册字符设备驱动  03 - open & close 函数 ...

  2. STM32---SPI通信的总结(库函数操作)

    STM32---SPI通信的总结(库函数操作) (想要全文PDF格式的留下邮箱)

  3. C语言之字符串探究(三):字符串库函数操作——strlen、strcat、strcpy、strcmp

    相关博文:C++之char和string字符串类探究 相关博文:C语言之数组探究(一):定义.大小.初始化.访问和三要素 相关博文:C语言之字符串探究(一):字符串与字符数组 相关博文:C语言之字符串 ...

  4. poi操作 excel 中文API文档

    poi操作 excel 中文API文档 依赖: <dependency><groupId>org.apache.poi</groupId><artifactI ...

  5. xls文件操作,中文模糊匹配

    对xls文件操作,中文模糊匹配 python读取xls 编辑xls文件 python 字符串有关操作 字符串模糊匹配 jieba中文分词 fuzzywuzzy python读取xls 安装xlrd包 ...

  6. 用Proteus学习51单片机之I2C(IIC)总线

    最近刚做好一个站,基于rails 3,教程为主,大家捧场看看,谢谢!www.yo945.com 在学习单片机的过程中,我常有这样的烦恼:随随便便一个芯片,少则占用三五个IO口,一般的就占用8个,稍微想 ...

  7. CubeMx笔记 -- IIC(位带操作实现)+ IO拓展

    文章目录 1.理论基础 1.1.物理层特点 1.2.通信过程 1.3.IIC架构 2.工程建立(硬件iic) 2.1.配置步骤 2.2.cubemx具体配置 3.应用(软件iic) 3.1.原理图 3 ...

  8. stm32 i2c/IIC读写HP303S气压传感器

    该款芯片的详细信息可以看其数据手册 ,这里不多做介绍. 读写HP303S的操作是基于IIC通讯的.本实验采用的是硬件IIC通讯,所以器件地址是0x77,值得注意的是,在stm32的硬件IIC 读写操作 ...

  9. PCF8574AT的I2C地址和单独IO操作

    PCF8574AT是飞利浦的一个IO扩展IC,I2C通讯接口,有8个IO口可以配置,只有一个寄存器.常见的一种应用是用它来作为LCD1602的I2C通讯界面. 在Arduino的LiquidCryst ...

  10. Linux下使用GPIO模拟I2C IIC驱动(PCF8563)

    此代码实现LINUX下,创建/dev/algortc设备,但是没有实现rtc标准的读写接口,仅仅实现了IIC时序模拟,编译出.ko文件之后,使用insmod命令挂载,代码里面的线程就会循环读写PCF8 ...

最新文章

  1. 字符串面试题(一)字符串逆序
  2. 【迁移学习(Transfer L)全面指南】2021年迁移学习发展现状及案例探究
  3. [网络安全提高篇] 一〇五.SQL注入之揭秘Oracle数据库注入漏洞和致命问题(联合Cream老师)
  4. 下载Bootstrap3
  5. 《Scikit-Learn与TensorFlow机器学习实用指南》第9章 启动并运行TensorFlow
  6. spring 锁_分布式锁-快速实战
  7. 拓端tecdat|python在Scikit-learn中用决策树和随机森林预测NBA获胜者
  8. OSAL操作系统抽象层
  9. 如何评价兰州交通大学的软件工程专业?
  10. 研发人员如何提高工作效率
  11. Python:Flask简单实现统计网站访问量
  12. 新版雨尘SEO静态页面生成系统源码PHP源码
  13. 华丽的设计,20个免费的图标字体
  14. 35+的测试人都去哪儿了?所谓“青春饭”真的只是在贩卖焦虑吗?
  15. 蒙特卡洛方法 matlab 实现
  16. HTML5期末大作业:体育网页设计——篮球专题6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
  17. Jmeter察看结果树之RegExp Tester (正则表达式测试)
  18. 【钟表识别】基于计算机视觉实现钟表时间识别含Matlab源码
  19. 冈萨雷斯《数字图像处理(第三版)》中文版纠错
  20. 内存检测工具BoundsChecker使用详述

热门文章

  1. 职称英语计算机考试取消,2020年职称英语考试取消了吗
  2. Ubuntu 12.04 首个测试版发布
  3. 苹果开发者计划注册流程
  4. FineBI教程之入门例子
  5. 【学渣告诉你】到底神马是傅里叶级数!!!!!!
  6. 虐心的《西部世界》第二季:我看哭了 人类和AI傻傻分不清
  7. Python保龄球计分Demo
  8. 中标麒麟服务器性能怎么样,中标麒麟Linux系统的性能分析及工具(74页)-原创力文档...
  9. centos oracle 修改监听服务名_虚拟机(Oracle Virtual Box)下ORACLE的安装
  10. 基于决策树模型的金融保险用户分类综合项目【数据可视化相关性分析填充缺失值转码建模商业应用】