当前位置: 首页 > 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.lryc.cn/news/576018.html

相关文章:

  • 数据结构之顺序表(C语言版本)
  • MongoDB 和 Redis的区别
  • Tomcat Maven 插件
  • iOS 远程调试与离线排查实战:构建非现场问题复现机制
  • K8s port、targetPort和nodePort区别
  • GitHub Actions与AWS OIDC实现安全的ECR/ECS自动化部署
  • TCP/IP协议简要概述
  • 国产鸿蒙系统开放应用侧载,能威胁到Windows地位吗?
  • 工作台-01.需求分析与设计
  • qq邮箱 新版 怎么去掉个性签名?
  • Java 大视界 -- Java 大数据在智能教育学习社群知识共享与协同学习促进中的应用(326)
  • 参考nlohmann json设计Cereal宏 一行声明序列化函数
  • vscode把less文件生成css文件配置,设置生成自定义文件名称和路径
  • ​​Git提交代码Commit消息企业级规范
  • 自动驾驶nuPlan数据集-入门使用和可视化操作
  • 【NodeJs】【npm】npm安装electron报错
  • 智能体记忆原理-prompt设计
  • [Ethernet in CANoe]1--SOME/IP arxml文件格式的区别
  • 基于Spring Cloud Alibaba构建微服务架构的实践探索
  • Ubuntu 部署 ResilioSync3.0 指南
  • IBM RAG 挑战赛 挑战赛 冠军 RAG_Challenge 系统性理解
  • 微调大语言模型(生成任务),怎么评估它到底“变好”了?
  • dp进阶,树形背包(dfs+01)
  • 自动对焦技术助力TGV检测 半导体检测精度大突破
  • 本地部署 WordPress 博客完整指南(基于 XAMPP)
  • Bootstrap 5学习教程,从入门到精通,Bootstrap 5 侧边栏导航(Offcanvas) 语法知识点及案例(26)
  • oracle基础审计管理
  • Django实战:自定义中间件实现全链路操作日志记录
  • IPv6配置
  • MySQL主从备份