void IOTest(void) { int g; PMD1bits.AD1MD = 1; PMD3bits.AD2MD = 1; for (g=0; g<=10; g++) { // Set as inputs setPinState(PIN_IN_GROUP(g,0), INPUT); setPinState(PIN_IN_GROUP(g,1), INPUT); setPinState(PIN_IN_GROUP(g,2), INPUT); setPinState(PIN_IN_GROUP(g,3), INPUT); if (g == 10) setPinState(PIN_IN_GROUP(g,4), INPUT); delay(1000); // Fail if low if (getPinValue(PIN_IN_GROUP(g,0)) == 0) failPin(PIN_IN_GROUP(g,0), 0); if (getPinValue(PIN_IN_GROUP(g,1)) == 0) failPin(PIN_IN_GROUP(g,1), 0); if (getPinValue(PIN_IN_GROUP(g,2)) == 0) failPin(PIN_IN_GROUP(g,2), 0); if (getPinValue(PIN_IN_GROUP(g,3)) == 0) failPin(PIN_IN_GROUP(g,3), 0); if (g == 10 && getPinValue(PIN_IN_GROUP(g,4)) == 0) failPin(PIN_IN_GROUP(g,4), 0); // Set pin A as output low setPinState(PIN_IN_GROUP(g,0), OUTPUT); setPinValue(PIN_IN_GROUP(g,0), 0); delay(1000); // Fail if C is high or if B or D is low if (getPinValue(PIN_IN_GROUP(g,1)) == 0) failPin(PIN_IN_GROUP(g,1), 1); if (getPinValue(PIN_IN_GROUP(g,2)) == 1) failPin(PIN_IN_GROUP(g,2), 1); if (getPinValue(PIN_IN_GROUP(g,3)) == 0) failPin(PIN_IN_GROUP(g,3), 1); if (g == 10 && getPinValue(PIN_IN_GROUP(g,4)) == 1) failPin(PIN_IN_GROUP(g,4), 1); // Set pin B as output low setPinState(PIN_IN_GROUP(g,0), INPUT); setPinState(PIN_IN_GROUP(g,1), OUTPUT); setPinValue (PIN_IN_GROUP(g,1), 0); delay(1000); // Fail if D is high or if A or C is low if (getPinValue(PIN_IN_GROUP(g,0)) == 0) failPin(PIN_IN_GROUP(g,0), 2); if (getPinValue(PIN_IN_GROUP(g,2)) == 0) failPin(PIN_IN_GROUP(g,2), 2); if (getPinValue(PIN_IN_GROUP(g,3)) == 1) failPin(PIN_IN_GROUP(g,3), 2); if (g == 10 && getPinValue(PIN_IN_GROUP(g,4)) == 0) failPin(PIN_IN_GROUP(g,4), 2); // Set pin C as output low setPinState(PIN_IN_GROUP(g,1), INPUT); setPinState(PIN_IN_GROUP(g,2), OUTPUT); setPinValue (PIN_IN_GROUP(g,2), 0); delay(1000); // Fail if A is high or if B or D is low if (getPinValue(PIN_IN_GROUP(g,0)) == 1) failPin(PIN_IN_GROUP(g,0), 3); if (getPinValue(PIN_IN_GROUP(g,1)) == 0) failPin(PIN_IN_GROUP(g,1), 3); if (getPinValue(PIN_IN_GROUP(g,3)) == 0) failPin(PIN_IN_GROUP(g,3), 3); if (g == 10 && getPinValue(PIN_IN_GROUP(g,4)) == 1) failPin(PIN_IN_GROUP(g,4), 3); // Set pin D as output low setPinState(PIN_IN_GROUP(g,2), INPUT); setPinState(PIN_IN_GROUP(g,3), OUTPUT); setPinValue (PIN_IN_GROUP(g,3), 0); delay(1000); // Fail if B is high or if A or C is low if (getPinValue(PIN_IN_GROUP(g,0)) == 0) failPin(PIN_IN_GROUP(g,0), 4); if (getPinValue(PIN_IN_GROUP(g,1)) == 1) failPin(PIN_IN_GROUP(g,1), 4); if (getPinValue(PIN_IN_GROUP(g,2)) == 0) failPin(PIN_IN_GROUP(g,2), 4); if (g == 10 && getPinValue(PIN_IN_GROUP(g,4)) == 0) failPin(PIN_IN_GROUP(g,4), 4); setPinState(PIN_IN_GROUP(g,3), INPUT); // Test the bonus G10P1 pin if (g == 10) { // Set the bonus G10P1 pin as output low setPinState(PIN_IN_GROUP(g,4), OUTPUT); setPinValue (PIN_IN_GROUP(g,4), 0); delay(1000); // Fail if A or C is high or if B or D is low if (getPinValue(PIN_IN_GROUP(g,0)) == 1) failPin(PIN_IN_GROUP(g,0), 4); if (getPinValue(PIN_IN_GROUP(g,1)) == 0) failPin(PIN_IN_GROUP(g,1), 4); if (getPinValue(PIN_IN_GROUP(g,2)) == 1) failPin(PIN_IN_GROUP(g,2), 4); if (getPinValue(PIN_IN_GROUP(g,3)) == 0) failPin(PIN_IN_GROUP(g,3), 4); setPinState(PIN_IN_GROUP(g,4), INPUT); } } PMD1bits.AD1MD = 0; PMD3bits.AD2MD = 0; }
/* supporta reStart */ uint8_t i2c_byteHandler_ISR(void) { uint8_t state; i2cData.status = TWSR; state = (i2cData.status & I2C_STATUS_MASK); /* Bad sync with the Linux RTC driver. Issues bad start/stop conditions, filtered with this delay. */ switch (state) { case I2C_MASTER_START_STATE: #if I2C_SLAVE_ONLY i2cData.stopReq = 1; #else /** Write/read mode */ i2c_write(i2cData.slaveAdx); #endif break; case I2C_MASTER_RESTART_STATE: #if I2C_SLAVE_ONLY i2cData.stopReq = 1; #else if (i2cData.mode == I2C_MASTER_RECEIVE_SEND_MODE) { /* Now we are in send */ i2cData.index = 0; /* Put mode send */ i2cData.mode = I2C_MASTER_SEND_MODE; i2cData.sendNack = 0; i2c_write(i2cData.slaveAdx&0xFE); /* Send bit write*/ } else if (i2cData.mode == I2C_MASTER_SEND_RECEIVE_MODE) { /* Now we are in send */ i2cData.index = 0; /* Put mode send */ i2cData.mode = I2C_MASTER_RECEIVE_MODE; i2cData.sendNack = 0; i2c_write(i2cData.slaveAdx|I2C_READ_BIT); /* Send bit read*/ } else { /*Errore */ i2cData.stopReq = 1; } #endif break; case I2C_SLAVE_RX_ADX_STATE: i2cData.busy = 1; #if I2C_SLAVE_LEN_LIMITED if ((i2cData.index+1) >= i2cData.buffLenRx) { /* Send NACK after next byte */ i2cData.sendNack = 1; } #endif rtcProtocol_freezeUserData(); break; case I2C_SLAVE_RX_DATA_ACK_TX_STATE: /* Normal condition: always here during this state */ rtcProtocol_writeToRTC(i2c_read()); #if I2C_SLAVE_LEN_LIMITED if ((i2cData.index+1) >= i2cData.buffLenRx) { /* Send NACK after next byte */ i2cData.sendNack = 1; } #else if ((i2cData.index+1) >= I2C_BUFF_LEN) { i2cData.index = 0; } #endif break; case I2C_SLAVE_RX_DATA_NACK_TX_STATE: /* next: I2C_SLAVE_STOP_RESTART_STATE */ rtcProtocol_setUserData(); break; case I2C_SLAVE_STOP_RESTART_STATE: i2cData.busy = 0; i2cData.buffLenRx = i2cData.index; i2cData.index = 0; i2cData.sendNack = 0; rtcProtocol_setUserData(); break; case I2C_SLAVE_TX_ADX_STATE: i2cData.busy = 1; rtcProtocol_freezeUserData(); i2c_write(rtcProtocol_readUserData()); #if I2C_SLAVE_LEN_LIMITED if ((i2cData.index+1) >= i2cData.buffLenTx) { /* Send NACK after next byte, means the last byte inthis state is transmitted */ i2cData.sendNack = 1; } #else if ((i2cData.index+1) >= I2C_BUFF_LEN) { i2cData.index = 0; } #endif break; case I2C_SLAVE_TX_DATA_ACK_RX_STATE: i2c_write(rtcProtocol_readUserData()); #if I2C_SLAVE_LEN_LIMITED if ((i2cData.index+1) >= i2cData.buffLenTx) { /* Send NACK after next byte, means the last byte in this state is transmitted */ i2cData.sendNack = 1; } #else if ((i2cData.index+1) >= I2C_BUFF_LEN) { i2cData.index = 0; } #endif break; case I2C_SLAVE_END_TX_DATA_ACK_RX_STATE: /* No more transfers. reactivate adx recognition */ /* If transmitted data is not available, must implemented a protocol to handle it */ /* this case covers the slave intention of not transmit enymore */ i2cData.sendNack = 0; i2cData.busy = 0; i2cData.index = 0; break; case I2C_SLAVE_TX_DATA_NACK_RX_STATE: /* No more transfers. reactivate adx recognition */ i2cData.sendNack = 0; i2cData.busy = 0; i2cData.index = 0; rtcProtocol_setUserData(); break; case I2C_MASTER_TX_ADX_ACK_NOT_RECEIVED_STATE: i2cData.stopReq = 1; break; case I2C_MASTER_TX_ADX_ACK_RECEIVED_STATE: #if I2C_SLAVE_ONLY i2cData.stopReq = 1; #else if (i2cData.index >= i2cData.buffLenTx) { if (i2cData.mode == I2C_MASTER_SEND_RECEIVE_MODE) { i2cData.reStartReq = 1; } else { i2cData.stopReq = 1; } } else { /** Index should be 0 here */ i2c_write(i2cData.bufferTx[i2cData.index++]); } #endif break; case I2C_MASTER_RX_ADX_ACK_RECEIVED_STATE: #if I2C_SLAVE_ONLY i2cData.stopReq = 1; #else /* wait for next data */ if ((i2cData.index+1) >= i2cData.buffLenRx) { /*Last byte: Send NACK after next byte */ i2cData.sendNack = 1; } #endif break; case I2C_MASTER_RX_ADX_ACK_NOT_RECEIVED_STATE: i2cData.stopReq = 1; break; case I2C_MASTER_END_RX_DATA_STATE: #if I2C_SLAVE_ONLY i2cData.stopReq = 1; #else /* last byte */ i2cData.bufferRx[i2cData.index] = i2c_read(); /* NACK was sent, now send stop or restart */ if (i2cData.mode == I2C_MASTER_RECEIVE_SEND_MODE) { i2cData.reStartReq = 1; } else { i2cData.stopReq = 1; } #endif break; case I2C_MASTER_RX_DATA_STATE: #if I2C_SLAVE_ONLY i2cData.stopReq = 1; #else if (i2cData.index >= i2cData.buffLenRx) { /* Error condition: we must never be in this condition because the last byte will be sent in I2C_END_RX_DATA */ if (i2cData.index == i2cData.buffLenRx) { i2cData.bufferRx[i2cData.index++] = i2c_read(); } i2cData.stopReq = 1; } else { /* Normal condition: always here during this state */ i2cData.bufferRx[i2cData.index++] = i2c_read(); if ((i2cData.index+1) >= i2cData.buffLenRx) { /* Send NACK after next byte */ i2cData.sendNack = 1; } } #endif break; case I2C_MASTER_TX_ACK_RECEIVED_STATE: #if I2C_SLAVE_ONLY i2cData.stopReq = 1; #else if (i2cData.index >= i2cData.buffLenTx) { if (i2cData.mode == I2C_MASTER_SEND_RECEIVE_MODE) { i2cData.reStartReq = 1; } else { i2cData.stopReq = 1; } } else { i2c_write(i2cData.bufferTx[i2cData.index++]); } #endif break; case I2C_MASTER_TX_ACK_NOT_RECEIVED_STATE: i2cData.stopReq = 1; break; default: i2cData.stopReq = 1; setPinValue(PORT_B, 5, 1); break; } //dataLogByte[cnt1++] = state; i2c_clearInt(); return state; }