Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
}