diff options
| author | Dean <Dean@d5102386-fcda-11dd-9fdb-3debd5008f28> | 2011-08-31 07:17:33 +0000 |
|---|---|---|
| committer | Dean <Dean@d5102386-fcda-11dd-9fdb-3debd5008f28> | 2011-08-31 07:17:33 +0000 |
| commit | 0834ca09464491a2b831e7801aea45d3a2b0227f (patch) | |
| tree | afc2c8b9321a04d1bb66cb47389ad249ec50e54e /LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c | |
| parent | c85052230594eef626d0f234130317e918f846c0 (diff) | |
Make TWI_ReadPacket() use a repeated start condition rather than a full bus release/recapture after the read address has been sent.
Fix TWI_ReadPacket() not releasing the bus correctly after all data transferred.
Make TWI_SendByte() and TWI_ReceiveByte() non-inline to reduce compiled binary size.
git-svn-id: http://lufa-lib.googlecode.com/svn/trunk@1917 d5102386-fcda-11dd-9fdb-3debd5008f28
Diffstat (limited to 'LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c')
| -rw-r--r-- | LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c | 63 |
1 files changed, 49 insertions, 14 deletions
diff --git a/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c b/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c index d4f594f3..d6db37d6 100644 --- a/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c +++ b/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c @@ -97,34 +97,69 @@ uint8_t TWI_StartTransmission(const uint8_t SlaveAddress, } } +bool TWI_SendByte(const uint8_t Byte) +{ + TWDR = Byte; + TWCR = ((1 << TWINT) | (1 << TWEN)); + while (!(TWCR & (1 << TWINT))); + + return ((TWSR & TW_STATUS_MASK) == TW_MT_DATA_ACK); +} + +bool TWI_ReceiveByte(uint8_t* const Byte, + const bool LastByte) +{ + uint8_t TWCRMask; + + if (LastByte) + TWCRMask = ((1 << TWINT) | (1 << TWEN)); + else + TWCRMask = ((1 << TWINT) | (1 << TWEN) | (1 << TWEA)); + + TWCR = TWCRMask; + while (!(TWCR & (1 << TWINT))); + *Byte = TWDR; + + uint8_t Status = (TWSR & TW_STATUS_MASK); + + return ((LastByte) ? (Status == TW_MR_DATA_NACK) : (Status == TW_MR_DATA_ACK)); +} + uint8_t TWI_ReadPacket(const uint8_t SlaveAddress, const uint8_t TimeoutMS, const uint8_t* InternalAddress, - const uint8_t InternalAddressLen, + 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) + if ((ErrorCode = TWI_StartTransmission((SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_WRITE, + TimeoutMS)) == TWI_ERROR_NoError) { - while (Length--) + while (InternalAddressLen--) { - if (!(TWI_ReceiveByte(Buffer++, (Length == 1)))) - { + if (!(TWI_SendByte(*(InternalAddress++)))) + { ErrorCode = TWI_ERROR_SlaveNAK; break; } } - TWI_StopTransmission(); + 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; @@ -145,7 +180,7 @@ uint8_t TWI_WritePacket(const uint8_t SlaveAddress, while (InternalAddressLen--) { if (!(TWI_SendByte(*(InternalAddress++)))) - { + { ErrorCode = TWI_ERROR_SlaveNAK; break; } |
