阅读:1891回复:4
How do "cypress 68013" send "write" command to the device on i2c bus
How do \"cypress 68013\" send \"write\" command to the device on i2c bus
device address :0xA2 device\'s slave address :0xFA value:0x00 cypress provides some codes... BOOL EZUSB_WriteI2C(BYTE addr, BYTE length, BYTE xdata *dat) BOOL EZUSB_WriteI2C_(BYTE addr, BYTE length, BYTE xdata *dat) What should i list in main() ?? void main() { ...... } [编辑 - 3/4/05 by p2324] |
|
沙发#
发布于:2005-03-04 01:23
help please!!!
|
|
板凳#
发布于:2005-03-04 15:40
first slave address,
second length:2 third :reg,value [编辑 - 3/4/05 by kris2001] |
|
|
地板#
发布于:2005-03-04 17:26
[quote]first slave address,
second length:2 third :reg,value Dear all, below is the source code, Because i just started to study the c code,may somebody help me to write the main() thanks very much!!!! #include <stdio.h> #include <fx2.h> #include <fx2regs.h> #define ALLOCATE_EXTERN I2CPCKT volatile I2CPckt; void EZUSB_InitI2C(void) { I2CPckt.status = I2C_IDLE; EI2C = 1; // Enable I2C interrupt EA = 1; // Enable 8051 interrupts #ifdef TNG I2CMODE |= 0x02; // enable I2C Stop interrupt #endif } void EZUSB_WaitForEEPROMWrite(BYTE addr) { #ifndef TNG // if in progress, wait for STOP to complete while (I2CS & bmSTOP); #endif // disable i2c interrupts EI2C = 0; do { I2CS |= bmSTART; I2DAT = addr << 1; while (!(I2CS & 1)); I2CS |= bmSTOP; while (I2CS & bmSTOP); } while (!(I2CS & bmACK)); // enable i2c interrupts EI2C = 1; } BOOL EZUSB_WriteI2C_(BYTE addr, BYTE length, BYTE xdata *dat) { #ifndef TNG // if in progress, wait for STOP to complete while (I2CS & bmSTOP); #endif if(I2CPckt.status == I2C_IDLE) { I2CS |= bmSTART; I2DAT = addr << 1; I2CPckt.length = length; I2CPckt.dat = dat; I2CPckt.count = 0; I2CPckt.status = I2C_SENDING; return(TRUE); } return(FALSE); } void i2c_isr(void) interrupt I2C_VECT { // I2C State Machine if(I2CS & bmBERR) I2CPckt.status = I2C_BERROR; else if ((!(I2CS & bmACK)) && (I2CPckt.status != I2C_RECEIVING)) I2CPckt.status = I2C_NACK; else switch(I2CPckt.status) { case I2C_SENDING: I2DAT = I2CPckt.dat[I2CPckt.count++]; if(I2CPckt.count == I2CPckt.length) I2CPckt.status = I2C_STOP; break; case I2C_PRIME: I2CPckt.dat[I2CPckt.count] = I2DAT; I2CPckt.status = I2C_RECEIVING; if(I2CPckt.length == 1) // may be only one byte read I2CS |= bmLASTRD; break; case I2C_RECEIVING: if(I2CPckt.count == I2CPckt.length - 2) I2CS |= bmLASTRD; if(I2CPckt.count == I2CPckt.length - 1) { I2CS |= bmSTOP; I2CPckt.status = I2C_IDLE; } I2CPckt.dat[I2CPckt.count] = I2DAT; ++I2CPckt.count; break; case I2C_STOP: I2CS |= bmSTOP; #ifdef TNG I2CPckt.status = I2C_WAITSTOP; #else I2CPckt.status = I2C_IDLE; #endif break; case I2C_WAITSTOP: I2CPckt.status = I2C_IDLE; break; } EXIF &= ~0x20; // Clear interrupt flag IE3_ // IE3 = 0; } BOOL EZUSB_WriteI2C(BYTE addr, BYTE length, BYTE xdata *dat) { EZUSB_WriteI2C_(addr, length, dat); while(TRUE) switch(I2CPckt.status) { case I2C_IDLE: return(I2C_OK); case I2C_NACK: I2CPckt.status = I2C_IDLE; return(I2C_NACK); case I2C_BERROR: I2CPckt.status = I2C_IDLE; return(I2C_BERROR); } } void main() { } |
|
地下室#
发布于:2005-03-04 21:12
cypress的例子里面很多啊。自己摸索一下。
|
|
|