NXP 1788 的I2C控制EEPROM(24C08)

2019-07-16 09:45发布

在读的时候不能发送重复发送起始信号,SI位不能清零:
代码如下,起始信号:
UNS_8 I2C0_Start()//void
{
        LPC_I2C0->CONCLR = 0x38;//1<<3|1<<4|1<<5

        LPC_I2C0->CONSET |= 0x20;
       
        while (!(LPC_I2C0->CONSET & 0x08));
       
        LPC_I2C0->CONCLR = 0x20;//1<< 5

        return (LPC_I2C0->STAT & 0xF8);
}
读取数据函数:
UNS_8 I2C0_ReadByte(UNS_8 t_slave_addr,
                    UNS_8 t_operation_addr,
                    UNS_8 *p_read_data,
                    UNS_8 t_data_num)
{
        UNS_8 t_status;
        UNS_8 t_count;
       
        t_status = I2C0_Start();
        while(t_status != 0x08);

        t_status = I2C0_SendByte(t_slave_addr);
        while(t_status != 0x18);

        t_status = I2C0_SendByte(t_operation_addr);
        while(t_status != 0x28);
       
        t_status = I2C0_Start();
        while(t_status != 0x10);


        t_status = I2C0_SendByte(t_slave_addr | 0x01);
        while(t_status != 0x40);

        for(t_count = 0; t_count < t_data_num; t_count++)
        {
                if(t_count)
                {
                        t_status = I2C0_GetByte(p_read_data,1);
                        while(t_status != 0x50);
                }
                else
                {
                        t_status = I2C0_GetByte(p_read_data,0);
                        while(t_status != 0x58);
                }
                p_read_data++;
        }
       
        I2C0_Stop();
       
        /*返回错误号*/
        return 1;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
一直新手
1楼-- · 2019-07-16 12:36
外设时钟是60M,传输速率是100KHz。
从机地址是0XA0,操作地址是0X00。
一直新手
2楼-- · 2019-07-16 13:39
这个是发送数据函数:
UNS_8 I2C0_SendByte(UNS_8 t_data)
{
        LPC_I2C0->DAT = t_data;
       
        /*加载数据后需清除SI位*/
        LPC_I2C0->CONSET = 0x04;

        LPC_I2C0->CONCLR = 0x08;//1<<3
       
        /*收到应答*/
        while(!(LPC_I2C0->CONSET & 0x08));

        return (LPC_I2C0->STAT & 0xF8);
}

一周热门 更多>