Added new high level TWI packet read/write commands, altered behaviour of the TWI_Sta...
[pub/USBasp.git] / LUFA / Drivers / Peripheral / TWI.c
index 6aaf192..2f4e4ed 100644 (file)
@@ -7,8 +7,8 @@
 
 #include "TWI.h"
 
-bool TWI_StartTransmission(const uint8_t SlaveAddress,
-                           const uint8_t TimeoutMS)
+uint8_t TWI_StartTransmission(const uint8_t SlaveAddress,
+                              const uint8_t TimeoutMS)
 {
        for (;;)
        {
@@ -33,17 +33,17 @@ bool TWI_StartTransmission(const uint8_t SlaveAddress,
                                                continue;
                                        default:
                                                TWCR = (1 << TWEN);
-                                               return false;
+                                               return TWI_ERROR_BusFault;
                                }
                        }
 
                        _delay_us(10);
                }
 
-               if (!(BusCaptured))
+               if (!(TimeoutRemaining))
                {
                        TWCR = (1 << TWEN);
-                       return false;
+                       return TWI_ERROR_BusCaptureTimeout;
                }
 
                TWDR = SlaveAddress;
@@ -59,17 +59,85 @@ bool TWI_StartTransmission(const uint8_t SlaveAddress,
                }
 
                if (!(TimeoutRemaining))
-                 return false;
+                 return TWI_ERROR_SlaveResponseTimeout;
 
                switch (TWSR & TW_STATUS_MASK)
                {
                        case TW_MT_SLA_ACK:
                        case TW_MR_SLA_ACK:
-                               return true;
+                               return TWI_ERROR_NoError;
                        default:
                                TWCR = ((1 << TWINT) | (1 << TWSTO) | (1 << TWEN));
-                               return false;
+                               return TWI_ERROR_SlaveNotReady;
+               }
+       }
+}
+
+uint8_t TWI_ReadPacket(const uint8_t SlaveAddress,
+                       const uint8_t TimeoutMS,
+                       const uint8_t* InternalAddress,
+                       uint8_t InternalAddressLen,
+                       uint8_t* Buffer,
+                       uint8_t Length)
+{
+       uint8_t ErrorCode;
+       
+       if ((ErrorCode = TWI_WritePacket(SlaveAddress, TimeoutMS, InternalAddress, InternalAddressLen,
+                                        NULL, 0)) != TWI_ERROR_NoError)
+       {
+               return ErrorCode;
+       }
+
+       if ((ErrorCode = TWI_StartTransmission((SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_READ,
+                                                                                  TimeoutMS)) == TWI_ERROR_NoError)
+       {
+               while (Length--)
+               {
+                       if (!(TWI_ReceiveByte(Buffer++, (Length == 0))))
+                       {
+                               ErrorCode = TWI_ERROR_SlaveNAK;
+                               break;
+                       }
                }
+               
+               TWI_StopTransmission();
        }
+       
+       return ErrorCode;
 }
 
+uint8_t TWI_WritePacket(const uint8_t SlaveAddress,
+                        const uint8_t TimeoutMS,
+                        const uint8_t* InternalAddress,
+                        uint8_t InternalAddressLen,
+                        const uint8_t* Buffer,
+                        uint8_t Length)
+{
+       uint8_t ErrorCode;
+
+       if ((ErrorCode = TWI_StartTransmission((SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_WRITE,
+                                              TimeoutMS)) == TWI_ERROR_NoError)
+       {
+               while (InternalAddressLen--)
+               {
+                       if (!(TWI_SendByte(*(InternalAddress++))))
+                       {
+                               ErrorCode = TWI_ERROR_SlaveNAK;
+                               break;
+                       }
+               }
+
+               while (Length--)
+               {
+                       if (!(TWI_SendByte(*(Buffer++))))
+                       {
+                               ErrorCode = TWI_ERROR_SlaveNAK;
+                               break;
+                       }
+               }
+               
+               TWI_StopTransmission();
+       }
+       
+       return ErrorCode;
+}