ARM LPC2378 I2C与HMC5883L的接口

ARM LPC2378 I2C与HMC5883L的接口,arm,embedded,keil,lpc,Arm,Embedded,Keil,Lpc,我正在尝试将LPC2378I2C0与HMC5883L接口。我编写了以下代码: main () { lcd_init(); lcd_clear(); PINSEL1 |= 0x01400000; I20CONCLR =0x6c; //Clear all flags I20CONSET=0X40; //Enable the interface. I20SCLH=I20SCLL=60; //100 KHz VICIntEnable |=

我正在尝试将LPC2378I2C0与HMC5883L接口。我编写了以下代码:

main () {

    lcd_init();
    lcd_clear();

    PINSEL1 |= 0x01400000;
    I20CONCLR =0x6c; //Clear all flags
    I20CONSET=0X40;  //Enable the interface. 
    I20SCLH=I20SCLL=60; //100 KHz

    VICIntEnable |= 0x0000200; 
    VICVectPriority9 = 1;
    VICVectAddr9 = (unsigned long)ISR_I2C;

    I20CONSET=0X60; //to send Start bit
    while(1)
    {
        // Idle state. Waiting for interrupts.    
    }

}

__irq void ISR_I2C(void) {
    int status;
    status=I20STAT;
    if(status==0X08) 
    {
        I20DAT=0x3C; // Slave address + R/W bit
        lcd_print("Hello"); 
        I20CONCLR=0x28; //start, interrupt clear
    }
    if(status==0X18) 
    {
        I20DAT=0x02;    //Slave ACK, Send data byte
        lcd_print("ACK");
        I20CONCLR=0x08; // interrupt clear
    }
    if(status==0X20) 
    {
        lcd_print("NACK");
        I20CONCLR=0x08; // interrupt clear
    }

    VICVectAddr = 0;

} 

当我在Keil中模拟运行时,我得到了NACK状态,这是预期的,因为没有从机进行确认,但是当我连接到HMC5883L时,在传输SLA+W字节后,我既没有达到ACK状态,也没有达到NACK状态。此问题的原因可能是什么?

您知道问题是出在i2C驱动程序还是通过i2C发送的数据上吗?如果你能将其分离出来,它将有助于解决你的问题。此外,如果你既没有收到ACK也没有收到NACK,让它打印出I20STAT寄存器的值,并在数据表中查找该值,以了解该值的含义。在调试器中一步一步地运行这个程序将帮助您监视所有这些寄存器。抱歉,除了这个建议之外,我并没有足够的LPC2378经验来提供帮助