PIC 24F I2C从器件问题

时间:2017-12-01 04:27:04

标签: i2c pic24

PIC 24F作为I2C从器件发出锁定问题,向主器件发送多个数据字节(MASTER READ)。

PIC(特别是24FJ128GB202)作为I2C从器件接收数据(MASTER WRITE)工作正常,通过所有单元测试。 (仅地址,地址和寄存器,地址寄存器单数据和多数据自动递增)

我的从代码可以处理仅地址并读取单个字节。它挂在主设备的多次读取上(自动增量)。

我使用 the Microchip app note作为我的代码的基础,以及查看Code Composer生成的代码。

初​​始化:

void I2C1_Initialize(void)
{
    I2C1ADD = I2C1_SLAVE_ADDRESS;
    I2C1MSK = I2C1_SLAVE_MASK;

    I2C1CONL = 0x8200;
    I2C1CONH = 0x0000;
    I2C1STAT = 0x0000;

    // clear the master interrupt flag
    IFS1bits.SI2C1IF = 0;
    // enable the master interrupt
    IEC1bits.SI2C1IE = 1;

}

中断写:

// clear the interrupt
_SI2C1IF = 0;

// Write from Master to Slave - Address
// S = 1, D_A = 0, R_W = 0, BF = 1
if  ( (I2C1STATbits.S == 1) && (I2C1STATbits.D_A == 0) && (I2C1STATbits.R_W == 0) && (I2C1STATbits.RBF == 1) )
    {
    myI2CAd = I2C1RCV;
    mySTATE = 0;
    }

// Write from Master to Slave - Data
// S = 1, D_A = 1, R_W = 0, BF = 1
if  ( (I2C1STATbits.S == 1) && (I2C1STATbits.D_A == 1) && (I2C1STATbits.R_W == 0) && (I2C1STATbits.RBF == 1))
    {
    mySTATE++;     
    if(mySTATE == 1)
        {
        myREGISTER = I2C1RCV;
        // limit register to MAX
        if(myREGISTER > I2CMAXREGISTER) myREGISTER = I2CMAXREGISTER;
        }
    if(mySTATE == 2)
        {
        myDATA = I2C1RCV;
        shelfregister[myREGISTER] = myDATA;
        }
    if(mySTATE > 2)
        {
        myDATA = I2C1RCV;
        // limit register to MAX
        if(myREGISTER < I2CMAXREGISTER) myREGISTER++;
        shelfregister[myREGISTER] = myDATA;
        }
    }

中断阅读:

// Read from Slave to Master - Address
// S = 1, D_A = 0, R_W = 1, BF = 0
if  ( (I2C1STATbits.S == 1) && (I2C1STATbits.D_A == 0) && (I2C1STATbits.R_W == 1) && (I2C1STATbits.TBF == 0) )
    {
    myI2CAd = I2C1RCV;
    I2C1TRN = shelfregister[myREGISTER];
    I2C1CONLbits.SCLREL = 1;
    if(myREGISTER < I2CMAXREGISTER) myREGISTER++;
    }

Code Composer为从属操作生成的代码非常相似,并且具有相同的问题。

我的主要问题是如何处理来自主设备的多个读取,而不仅仅是在此读取功能中处理的单个字节。它应该包括检查I2CSTATbits.ACKSTAT,但该位的时序对我来说不清楚,因为它应该在字节进入寄存器后的9个时钟发生,但是没有位指示该时间点。任何指导意见。

0 个答案:

没有答案