一次写一系列 i2c 寄存器操作

本文详细介绍了如何进行一系列I2C通信协议下的寄存器操作,包括使用C语言、codec和struct等数据结构进行高效编程的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 写一系列寄存器操作:

lc1120_write_regs(codec, lc1120_init_data, ARRAY_SIZE(lc1120_init_data)

2. 数据结构定义和数据内容:

    typedef struct lc1120_i2c_data
    {
        unsigned char nreg;     //寄存器地址
        unsigned char nvalue;   //要写入的值
        unsigned char nmask;    //要写入的位掩码
        unsigned char ndelay_times;    //写完后延时
    }CODEC_I2C_DATA_T;

    static CODEC_I2C_DATA_T lc1120_init_data[]=
    {
        {LC1120_R93, 0x01, 0xff, 0x01},
        {LC1120_R5, 0x99, 0xff, 0x01},
        {LC1120_R84, 0x76, 0xff, 0x00},
        {LC1120_R87, 0xf7, 0xff, 0x01},
        {LC1120_R86, 0x58, 0xff, 0x01},
        {LC1120_R89, 0xb0, 0xff, 0x01},
        {LC1120_R88, 0x48, 0xff, 0x01},
    };

3. 具体实现方式:
    static int lc1120_write_regs(struct snd_soc_codec *codec,
                CODEC_I2C_DATA_T *pInitHandle, int nLength)
    {
        int i=0;
        int nRst =0;
        unsigned char nData=0;
        for( i=0; i<nLength; i++)   //用array_size 计算出循环次数
        {
            nData = lc1120_read(codec, pInitHandle[i].nreg);   //先读出指定地址的寄存器值
            if(pInitHandle[i].nmask)
            {
                nData &= (~pInitHandle[i].nmask);           //掩码操作
            }
            nData = pInitHandle[i].nvalue|nData;           //计算得出要写入的值
            nRst =lc1120_write(codec, pInitHandle[i].nreg, nData);  //写入寄存器
            if (nRst)
                break;
            mdelay(pInitHandle[i].ndelay_times);  //如过需要延时,就执行延时操作
        }
        return nRst;
真的很经典的代码。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值