00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "at91sam7s64.h"
00020 #include "global.h"
00021
00022
00023 #include "rprintf.h"
00024 #include "timer.h"
00025 #include "i2c.h"
00026
00027
00028 void i2cInit(void)
00029 {
00030
00031 *AT91C_PIOA_PDR = AT91C_PA3_TWD | AT91C_PA4_TWCK;
00032 *AT91C_PIOA_ASR = AT91C_PA3_TWD | AT91C_PA4_TWCK;
00033
00034 *AT91C_PIOA_MDER = AT91C_PA3_TWD | AT91C_PA4_TWCK;
00035
00036
00037 AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_TWI);
00038
00039
00040
00041
00042
00043 AT91C_BASE_TWI->TWI_CWGR = 0x0001C0C0;
00044
00045
00046
00047 AT91C_BASE_TWI->TWI_CR = AT91C_TWI_MSEN;
00048 }
00049
00050 int i2cMasterSend(u08 deviceAddr, u08 length, u08 *data)
00051 {
00052 int status;
00053
00054
00055 AT91C_BASE_TWI->TWI_MMR = deviceAddr<<16;
00056
00057
00058 if(length)
00059 {
00060
00061 AT91C_BASE_TWI->TWI_THR = *data++;
00062 length--;
00063 }
00064
00065 AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START;
00066
00067 do
00068 {
00069
00070 delay_us(50);
00071
00072 status = AT91C_BASE_TWI->TWI_SR;
00073
00074 if(status & AT91C_TWI_NACK)
00075 return I2C_ERROR_NODEV;
00076 } while(!(status & AT91C_TWI_TXRDY));
00077
00078 while(length)
00079 {
00080
00081 AT91C_BASE_TWI->TWI_THR = *data++;
00082 length--;
00083
00084 while(!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXRDY));
00085 }
00086
00087 AT91C_BASE_TWI->TWI_CR = AT91C_TWI_STOP;
00088
00089 while(!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXCOMP));
00090
00091 return (AT91C_BASE_TWI->TWI_SR & AT91C_TWI_NACK);
00092 }
00093
00094 int i2cMasterReceive(u08 deviceAddr, u08 length, u08 *data)
00095 {
00096 int status;
00097
00098
00099 AT91C_BASE_TWI->TWI_MMR = (deviceAddr<<16) | AT91C_TWI_MREAD;
00100
00101 AT91C_BASE_TWI->TWI_RHR;
00102
00103
00104
00105 AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START;
00106
00107 do
00108 {
00109
00110 delay_us(50);
00111
00112 status = AT91C_BASE_TWI->TWI_SR;
00113
00114 if(status & AT91C_TWI_NACK)
00115 return I2C_ERROR_NODEV;
00116 } while(!(status & AT91C_TWI_RXRDY));
00117
00118 while(length)
00119 {
00120
00121 *data++ = AT91C_BASE_TWI->TWI_RHR;
00122 length--;
00123
00124 while(!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_RXRDY));
00125 }
00126
00127 AT91C_BASE_TWI->TWI_CR = AT91C_TWI_STOP;
00128
00129 while(!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXCOMP));
00130
00131 return (AT91C_BASE_TWI->TWI_SR & AT91C_TWI_NACK);
00132 }
00133
00134
00135 void i2cScanBus(void)
00136 {
00137 int i;
00138 u08 packet[1];
00139
00140
00141 for(i=1; i<128; i++)
00142 {
00143 if(!i2cMasterSend(i, 1, packet))
00144 rprintf("I2C Device addr 0x%x -> PRESENT\n", i);
00145 else
00146 rprintf("I2C Device addr 0x%x -> NACK\n", i);
00147 }
00148 }
00149