单片机学习小组
直播中

刘强

7年用户 1195经验值
私信 关注

NANO120中I2C驱动寄存器写入不了怎么解决?

在写NANO120驱动24C02的程序中,对I2C的初始化如下:
void I2C0_Init()
{
        //使能I2C0引脚        
    SYS->PA_L_MFP &= ~(SYS_PA_H_MFP_PA8_MFP_Msk | SYS_PA_H_MFP_PA9_MFP_Msk);
    SYS->PA_L_MFP |= (SYS_PA_H_MFP_PA9_MFP_I2C0_SCL | SYS_PA_H_MFP_PA8_MFP_I2C0_SDA);

        //使能I2C0时钟
         CLK_EnableModuleClock(I2C0_MODULE);

        //使能I2C
         I2C0->CON |=I2C_CON_IPEN_Msk;

         /* Enable I2C0 interrupt */
    I2C_EnableInt(I2C0);
    NVIC_EnableIRQ(I2C0_IRQn);
         DEBUGMSG("I2C0 initial over!\n");
}

然后在读写操作24C02中,对I2C的控制寄存器进行写操作,发现无法写入,以下是写入寄存器的代码:
I2C_SET_CONTROL_REG(I2C0,I2C_STA);
I2C_SET_CONTROL_REG(I2C0,I2C_SI);

请问如何解决?求大神!


回帖(1)

王璐

2024-1-2 16:36:06
nbsp;   //开启I2C时钟模块
    CLK_EnableModuleClock(I2C0_MODULE);
   
    //设置I2C0通信速率
    I2C_Open(I2C0, 100000);
   
    //使能I2C0中断
    I2C_EnableInt(I2C0);
}

在写入寄存器时,你需要先发送开始信号,然后发送器件地址和写命令,再发送要写入的寄存器地址和数据。示例如下:

//发送I2C起始信号
I2C_START(I2C0);

//发送器件地址+写命令
I2C_SendByte(I2C0, I2C_SLAVE_ADDR << 1);

//检查ACK是否正确,如果不正确则处理错误
if(I2C_GET_ACK(I2C0))
{
    //处理错误
}

//发送寄存器地址
I2C_SendByte(I2C0, REG_ADDR);

//检查ACK是否正确,如果不正确则处理错误
if(I2C_GET_ACK(I2C0))
{
    //处理错误
}

//发送要写入的数据
I2C_SendByte(I2C0, data);

//检查ACK是否正确,如果不正确则处理错误
if(I2C_GET_ACK(I2C0))
{
    //处理错误
}

//发送I2C停止信号
I2C_STOP(I2C0);
举报

更多回帖

发帖
×
20
完善资料,
赚取积分