我是嵌入式编程的新手,正在尝试让我的第一个 I2C 项目工作。我正在使用 PIC32MX795F512L。我非常关注 PIC32 上 I2C 的微芯片数据表。我遇到的问题是从未从 I2C1STAT 寄存器中清除 S 位。我实际上不清楚我是否必须这样做,或者它是否在 Start 事件结束时自动完成,但现在我正在尝试手动清除它。但是,我所做的任何事情似乎都没有效果。如果需要更多信息以便更容易理解正在发生的事情,请告诉我。我正在使用 PICKIT3,所以我也可以获得调试信息。我知道主中断发生,S 位被设置,我退出中断代码并挂在 while 语句检查 I2C1STATbits.S。
编辑:我正在编辑这篇文章以使用我的新代码而不是旧代码。我现在使用的是 20MHZ 外设时钟。只是我今天尝试的许多事情中的一件不起作用。延迟只是 256 毫秒的延迟。我知道超长,但很快。
main()
{
//Setup I2C1CON
I2C1CONbits.SIDL = 0; //Continue to run while in Idle
I2C1CONbits.SCLREL = 1; //Release the clock (Unsure of this)
I2C1CONbits.A10M = 0; //Using a 7 bit slave address
I2C1CONbits.DISSLW = 1; //Slew rate control disabled because running at 100 KHZ
I2C1ADD = 0x1E; //Slave address without read or write bit
I2C1BRG = 0x060; //Set the BRG clock rate - Based on Page 24-19
I2C1CONbits.ON = 1; //Turn on the I2C module
delay();
I2C1CONbits.SEN = 1; //Initiate a start event
while(I2C1CONbits.SEN == 1); //Wait until Start event is done
I2C1TRN = 0x3C; //Load the address into the Transmit register
while(I2C1STATbits.TRSTAT == 1);
while(I2C1STATbits.ACKSTAT == 0); //Wait for a ACK from the device
I2C1TRN = 0x00;
while(I2C1STATbits.TRSTAT == 1);
while(I2C1STATbits.ACKSTAT == 0);
I2C1TRN = 0x70;
while(I2C1STATbits.TRSTAT == 1);
while(I2C1STATbits.ACKSTAT == 0);
while(1);
}
谢谢你的帮助。