当前位置: 首页 > 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。

相关文章:

  • TTvideo免费开源PC录屏软件
  • UE--Slate 焦点、捕获,输入处理与玩家控制器的关系
  • 【 MyBatis-Plus | 精讲 】
  • 1 Studying《Is Parallel Programming Hard》1-5
  • 【网络安全】密码学知识普及
  • leetcode.2014 重复k次的最长子序列
  • Unity 脚本自动添加头部注释
  • 不同信创系统如何集中远程运维?贝锐向日葵提供稳定方案
  • 科技如何影响我们的生活?
  • word中如何保存高清图片,并保存为高质量的pdf文件(图像不失真)
  • uniappx 安卓app项目本地打包运行,腾讯地图报错:‘鉴权失败,请检查你的key‘
  • CSS3实现同心圆效果
  • 系统架构设计师论文分享-论单元测试方法及其应用
  • SolidWorks 镜像实体操作指南:解决镜像失败的常见问题
  • Oracle/PostgreSQL/MSSQL/MySQL函数实现对照表
  • SQL Server for Linux 如何实现高可用架构
  • 多模态融合相机L3CAM
  • 腾讯云TSE注册中心实战:Nacos高可用集群搭建与流量治理避坑指南
  • 如何给程序员用户画像?
  • MySQL 第十一讲---进阶篇 索引(上)