当前位置: 首页 > news >正文

day49-硬件学习之I2C(续)

一、I2C(续)

1.1 I2C寄存器

I2C_IADR地址寄存器(作为从机使用)
I2C_IFDR频率分频寄存器
I2C_I2CR控制寄存器
I2C_I2SR状态寄存器
I2C_I2DR数据寄存器

1.2 代码编写

初始化:

void init_i2c_io(I2C_Type *base)
{if(base == I2C1){IOMUXC_SetPinMux(IOMUXC_UART4_RX_DATA_I2C1_SDA, 1);IOMUXC_SetPinMux(IOMUXC_UART4_TX_DATA_I2C1_SCL, 1);IOMUXC_SetPinConfig(IOMUXC_UART4_RX_DATA_I2C1_SDA, 0x70B0);IOMUXC_SetPinConfig(IOMUXC_UART4_TX_DATA_I2C1_SCL, 0x70B0);}
}void init_i2c(I2C_Type *base)
{init_i2c_io(base);if(base == I2C1){base->I2CR &= ~(1 << 7);base->IFDR = 0x15;base->I2CR |= (1 << 7);}
}

写操作 : 

void i2c_write(I2C_Type *base, unsigned char dev_addr, unsigned char reg_addr, unsigned char *data, unsigned int len)
{base->I2SR &= ~((1 << IAL) | (1 << IIF));while((base->I2SR & (1 << ICF)) == 0);base->I2CR |= (1 << MSTA) | (1 << MTX);base->I2CR &= ~(1 << TXAK);base->I2SR &= ~(1 << IIF);base->I2DR = dev_addr << 1;while((base->I2SR & (1 << IIF)) == 0);base->I2SR &= ~(1 << IIF);base->I2DR = reg_addr;while((base->I2SR & (1 << IIF)) == 0);while(len--){base->I2SR &= ~(1 << IIF);base->I2DR = *data++;while((base->I2SR & (1 << IIF)) == 0);}base->I2CR &= ~(1 << 5);while((base->I2SR & (1 << IBB)) != 0){delay_us(100);}
}

 读操作:

void i2c_read(I2C_Type *base,  unsigned char dev_addr, unsigned char reg_addr, unsigned char *data, unsigned int len)
{base->I2SR &= ~((1 << IAL) | (1 << IIF));while((base->I2SR & (1 << ICF)) == 0);base->I2CR |= (1 << MSTA) | (1 << MTX);base->I2CR &= ~(1 << TXAK);base->I2SR &= ~(1 << IIF);base->I2DR = dev_addr << 1;while((base->I2SR & (1 << IIF)) == 0);base->I2SR &= ~(1 << IIF);base->I2DR = reg_addr;while((base->I2SR & (1 << IIF)) == 0);base->I2CR |= (1 << RSTA);base->I2SR &= ~(1 << IIF);base->I2DR = (dev_addr << 1 ) | 1;while((base->I2SR & (1 << IIF)) == 0);base->I2CR &= ~(1 << MTX);base->I2SR &= ~(1 << IIF);if(1 == len){base->I2CR |= (1 << TXAK);}*data = base->I2DR;while(len--){while((base->I2SR & (1 << IIF)) == 0);base->I2SR &= ~(1 << IIF);if(1 == len){base->I2CR |= (1 << TXAK);}else if(0 == len){unsigned int t;base->I2CR &= ~((1 << MSTA) | (1 << TXAK));while(((base->I2SR & (1 << IBB)) != 0) && t < 10){t++;delay_us(100);}}*data++ = base->I2DR;}
}

想要实现浮点型运算,需打开相应的FPU。

http://www.lqws.cn/news/547597.html

相关文章:

  • Tomcat Maven 插件
  • 第六章 STM32内存管理
  • 黑马JVM解析笔记(五):深入理解Java字节码执行机制
  • SpringBoot自动配置原理详解
  • 修复opensuse 风滚草rabbitmq的Error: :plugins_dir_does_not_exist问题
  • 关于前端npm install安装依赖和打包的一些问题记录
  • Django实战:自定义中间件实现全链路操作日志记录
  • 设计模式 | 桥接模式
  • K8s port、targetPort和nodePort区别
  • 使用Puppeteer提取页面内容的技巧
  • 小米路由器 AX3000T 解锁 SSH
  • TCP四层模型:网络协议核心解密
  • 鸿蒙HarmonyOS 关于图片、视频的选择详解
  • Veo 3 视频生成大模型完整操作教程(2025)
  • 《Effective Python》第十章 健壮性——始终将资源传递给生成器,并在外部由调用者清理它们
  • 【RAG面试题】如何获取准确的语义表示
  • ​​Git提交代码Commit消息企业级规范
  • algorithm ——————》双指针(移动0 复写0 快乐数 装水问题 以及数组中找几个数和为指定的元组)
  • 链表两数相加深度解析【进位】【边界条件】【迭代】【递归】
  • Spring Boot 应用开发实战指南:从入门到实战(内含实用技巧+项目案例)
  • 人工智能-基础篇-2-什么是机器学习?(ML,监督学习,半监督学习,零监督学习,强化学习,深度学习,机器学习步骤等)
  • Windows的xshell连接VW里的centos系统里的mysql失败解决方法
  • PostgreSQL 主从集群搭建
  • 杭州市长姚高员带队调研景联文科技,听取高质量数据集建设情况
  • [特殊字符] Python 批量合并 Word 表格中重复单元格教程(收货记录案例实战)
  • 从零开始的二三维CAD|CAE轻量级软件开发:学习以及研发,Gmsh的脚本编辑器设计!
  • python 脚本 遍历目录,并把目录下的非utf-8文件改成utf8
  • 16.2 Docker多阶段构建实战:LanguageMentor镜像瘦身40%,支持500+并发1.2秒响应!
  • 02【C++ 入门基础】标准输入输出初识/缺省参数
  • Qt 与 Halcon 联合开发六:基于海康SDK设计完整的相机类【附源码】