123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
-
- #if __GNUC__
- #include <avr/io.h>
- #else
- #include <inavr.h>
- #include <ioavr.h>
- #endif
- #include "USI_TWI_Master.h"
-
- unsigned char USI_TWI_Master_Transfer(unsigned char);
- unsigned char USI_TWI_Master_Stop(void);
-
- union USI_TWI_state {
- unsigned char errorState;
-
- struct {
- unsigned char addressMode : 1;
- unsigned char masterWriteDataMode : 1;
- unsigned char unused : 6;
- };
- } USI_TWI_state;
-
-
- void USI_TWI_Master_Initialise(void)
- {
- PORT_USI |= (1 << PIN_USI_SDA);
- PORT_USI |= (1 << PIN_USI_SCL);
-
- DDR_USI |= (1 << PIN_USI_SCL);
- DDR_USI |= (1 << PIN_USI_SDA);
-
- USIDR = 0xFF;
- USICR = (0 << USISIE) | (0 << USIOIE) |
- (1 << USIWM1) | (0 << USIWM0) |
- (1 << USICS1) | (0 << USICS0) | (1 << USICLK) |
- (0 << USITC);
- USISR = (1 << USISIF) | (1 << USIOIF) | (1 << USIPF) | (1 << USIDC) |
- (0x0 << USICNT0);
- }
-
-
- unsigned char USI_TWI_Get_State_Info(void)
- {
- return (USI_TWI_state.errorState);
- }
-
-
- #ifndef __GNUC__
- __x
- #endif
- unsigned char
- USI_TWI_Start_Transceiver_With_Data(unsigned char *msg, unsigned char msgSize)
- {
- unsigned char tempUSISR_8bit = (1 << USISIF) | (1 << USIOIF) | (1 << USIPF) | (1 << USIDC)
- |
- (0x0 << USICNT0);
- unsigned char tempUSISR_1bit = (1 << USISIF) | (1 << USIOIF) | (1 << USIPF) | (1 << USIDC)
- |
- (0xE << USICNT0);
-
- USI_TWI_state.errorState = 0;
- USI_TWI_state.addressMode = TRUE;
-
- #ifdef PARAM_VERIFICATION
- if (msg > (unsigned char *)RAMEND)
- {
- USI_TWI_state.errorState = USI_TWI_DATA_OUT_OF_BOUND;
- return (FALSE);
- }
- if (msgSize <= 1)
- {
- USI_TWI_state.errorState = USI_TWI_NO_DATA;
- return (FALSE);
- }
- #endif
-
- #ifdef NOISE_TESTING
- if (USISR & (1 << USISIF)) {
- USI_TWI_state.errorState = USI_TWI_UE_START_CON;
- return (FALSE);
- }
- if (USISR & (1 << USIPF)) {
- USI_TWI_state.errorState = USI_TWI_UE_STOP_CON;
- return (FALSE);
- }
- if (USISR & (1 << USIDC)) {
- USI_TWI_state.errorState = USI_TWI_UE_DATA_COL;
- return (FALSE);
- }
- #endif
-
- if (!(*msg
- & (1 << TWI_READ_BIT)))
- {
- USI_TWI_state.masterWriteDataMode = TRUE;
- }
-
-
- PORT_USI |= (1 << PIN_USI_SCL);
- while (!(PIN_USI & (1 << PIN_USI_SCL)))
- ;
- #ifdef TWI_FAST_MODE
- DELAY_T4TWI;
- #else
- DELAY_T2TWI;
- #endif
-
-
- PORT_USI &= ~(1 << PIN_USI_SDA);
- DELAY_T4TWI;
- PORT_USI &= ~(1 << PIN_USI_SCL);
- PORT_USI |= (1 << PIN_USI_SDA);
-
- #ifdef SIGNAL_VERIFY
- if (!(USISR & (1 << USISIF))) {
- USI_TWI_state.errorState = USI_TWI_MISSING_START_CON;
- return (FALSE);
- }
- #endif
-
-
- do {
-
- if (USI_TWI_state.addressMode || USI_TWI_state.masterWriteDataMode) {
-
- PORT_USI &= ~(1 << PIN_USI_SCL);
- USIDR = *(msg++);
- USI_TWI_Master_Transfer(tempUSISR_8bit);
-
-
- DDR_USI &= ~(1 << PIN_USI_SDA);
- if (USI_TWI_Master_Transfer(tempUSISR_1bit) & (1 << TWI_NACK_BIT)) {
- if (USI_TWI_state.addressMode)
- USI_TWI_state.errorState = USI_TWI_NO_ACK_ON_ADDRESS;
- else
- USI_TWI_state.errorState = USI_TWI_NO_ACK_ON_DATA;
- return (FALSE);
- }
- USI_TWI_state.addressMode = FALSE;
- }
-
- else {
-
- DDR_USI &= ~(1 << PIN_USI_SDA);
- *(msg++) = USI_TWI_Master_Transfer(tempUSISR_8bit);
-
-
- if (msgSize == 1)
- {
- USIDR = 0xFF;
- } else {
- USIDR = 0x00;
- }
- USI_TWI_Master_Transfer(tempUSISR_1bit);
- }
- } while (--msgSize);
-
- USI_TWI_Master_Stop();
-
-
- return (TRUE);
- }
-
-
- unsigned char USI_TWI_Master_Transfer(unsigned char temp)
- {
- USISR = temp;
-
- temp = (0 << USISIE) | (0 << USIOIE) |
- (1 << USIWM1) | (0 << USIWM0) |
- (1 << USICS1) | (0 << USICS0) | (1 << USICLK) |
- (1 << USITC);
- do {
- DELAY_T2TWI;
- USICR = temp;
- while (!(PIN_USI & (1 << PIN_USI_SCL)))
- ;
- DELAY_T4TWI;
- USICR = temp;
- } while (!(USISR & (1 << USIOIF)));
-
- DELAY_T2TWI;
- temp = USIDR;
- USIDR = 0xFF;
- DDR_USI |= (1 << PIN_USI_SDA);
-
- return temp;
- }
-
-
- unsigned char USI_TWI_Master_Stop(void)
- {
- PORT_USI &= ~(1 << PIN_USI_SDA);
- PORT_USI |= (1 << PIN_USI_SCL);
- while (!(PIN_USI & (1 << PIN_USI_SCL)))
- ;
- DELAY_T4TWI;
- PORT_USI |= (1 << PIN_USI_SDA);
- DELAY_T2TWI;
-
- #ifdef SIGNAL_VERIFY
- if (!(USISR & (1 << USIPF))) {
- USI_TWI_state.errorState = USI_TWI_MISSING_STOP_CON;
- return (FALSE);
- }
- #endif
-
- return (TRUE);
- }
|