I2C学习笔记二

AT24C0x EEPROM详解

at24c0x

at24c0x是一个2k位串行CMOS EEPROM,内部含有256个8位字节。该器件通过IC总线接口进行操作,有一个专门的写保护功能。
AT24C02 E2PROM介绍及驱动程序 - JUN - Juns channel

A0 A1 A2器件地址选择器

SDL串行数据/地址

SCL时钟

WP写保护

源码分析

init和exit

i2c_dev_init

ret = register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops);  
i2c_dev_class = class_create(THIS_MODULE, "i2cdev");  //用于创建设备节点
ret = i2c_add_driver(&i2c_dev_driver);

static struct i2c_driver i2c_dev_driver = {
    .driver = {
        .name = "i2cdev",
        .owner = THIS_MODULE,
        .of_match_table = of_match_ptr(i2cdev_dt_ids),
    },
    .probe	= i2c_dev_probe,
    .remove	= i2c_dev_remove,
    .id_table   = i2c_dev_id,
};

i2c_dev_exit

i2c_del_driver(&i2c_dev_driver); 
class_destroy(i2c_dev_class);  
unregister_chrdev(I2C_MAJOR,"i2cdev"); 

i2c_dev_probe

i2cdev->dev = device_create(i2c_dev_class, NULL, MKDEV(I2C_MAJOR, client->adapter->nr), 
NULL,"i2c-%d",client->adapter->nr);
另外,在里面进行了自测
#ifdef I2CDEV_TEST
    INIT_DELAYED_WORK(&i2cdev->work, i2cdev_test_work);
    i2cdev->wq = create_singlethread_workqueue("i2cdev_test_workqueue");
    queue_delayed_work(i2cdev->wq, &i2cdev->work, 50);
#endif

i2cdev_fops

static const struct file_operations i2cdev_fops = {  
    .owner      = THIS_MODULE,  
    .read       = i2cdev_read,  
    .write      = i2cdev_write,  
    .unlocked_ioctl = i2cdev_ioctl,  
    .open       = i2cdev_open,  
    .release    = i2cdev_release,  
}; 

open

static int i2cdev_open(struct inode *inode, struct file *file)
{
    struct i2c_client *client = i2cdev_client;
    
    file->private_data = client;
   
    return 0;
}
将设备的私有信息赋给file

release

static int i2cdev_release(struct inode *inode, struct file *file)
{
   
    file->private_data = NULL;
   
    return 0;
}

read

先写要读取的地址
       tmp[0] = ((u8)(addr >> 8));
        tmp[1] = ((u8)(addr));
        ret = i2c_master_send(client, tmp, ADDR_REG);
读取数据
ret = i2c_master_recv(client, &rx_buf[(page_nr * FLASH_PAGE_SIZE)], FLASH_PAGE_SIZE);

write

copy_from_user(&tmp[ADDR_REG],buf,count))
ret  += i2c_master_send(client, tmp, FLASH_PAGE_SIZE + ADDR_REG);




### 关于蓝桥杯嵌入式比赛中的I2C学习资料和技术笔记 在准备蓝桥杯嵌入式的比赛中,掌握I2C协议及其应用是非常重要的。以下是针对I2C相关内容的学习建议以及参考资料: #### 一、基础知识 I2C(Inter-Integrated Circuit)是一种用于短距离通信的串行总线协议,广泛应用于嵌入式系统中设备间的通信。其特点包括支持多主控和多从机模式,通过SDA(数据线)和SCL(时钟线)实现双向传输[^1]。 #### 、具体应用场景 在蓝桥杯嵌入式竞赛中,通常涉及以下两个典型场景: 1. **读取24C02 EEPROM存储器** 使用I2C协议与24C02芯片交互,完成数据的入和读取操作。这需要理解地址帧结构、起始条件、停止条件等基本概念[^2]。 2. **控制MCP4017可编程电阻** MCP4017是一款基于I2C接口的数字电位计,能够通过软件调整阻值。参赛者需熟悉如何配置寄存器并发送命令字节来改变输出电压。 #### 三、推荐学习资源 1. **博客文章** - @maosql 提供了一系列有关蓝桥杯嵌入式比赛的技术分享,其中包含了对常见硬件模块的操作指南及调试经验总结。 - 文章链接:视频教程 2. **官方文档或开源项目** - 参考 `iic-hal.c` 和 `iic-hal.h` 文件作为驱动开发的基础框架,在实际工程项目中可根据需求对其进行适配修改[^3]。 - 将上述源码迁移到 BSP (Board Support Package) 目录下,并遵循团队内部统一命名规范以便维护管理。 3. **实践案例分析** 结合理论知识动手搭建实验平台验证功能正确性至关重要。例如尝试编一段简单的程序初始化 I²C 总线并与外设建立连接;或者模拟真实赛场环境测试时间效率等问题解决能力提升效果显著。 #### 四、注意事项 - 编程过程中要特别留意端口方向设置及时序参数调节以确保信号质量稳定可靠; - 防止因拉高/拉低电流过大损坏器件引脚; - 对异常情况进行充分预判处理以免影响整体性能表现。 ```c // 示例代码片段展示基础收发流程 #include "iic_hal.h" void iic_init(void){ // 初始化GPIO及相关寄存器状态... } uint8_t iic_start(uint8_t slave_addr){ // 发送启动信号并指定目标设备地址返回应答标志位 } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值