阅读:1136回复:2
I2C求助
我作了一个i2c程序,对一a/d进行控制,但总也不能正确写入或读出,求各位大侠指点
代码为: //==============================THIS IS I2C CONTROL CODE START==================== char SDA(char dir,char val) //用两根io线来作为控制线(用dsp tms320c6416) { if(dir==1)//输出 { GPDIR = GPDIR | 0X0020; if(val==0)//输出0 { GPVAL = GPVAL & 0X0FFDF; } else { GPVAL = GPVAL | 0X0020; } } else//输入 { GPDIR=GPDIR & 0X0FFDF; if(GPVAL&0X0020==0) { return 0; } else { return 1; } } } void SCL(char val) { // GPDIR = GPDIR | 0X0020; if(val==0)//输出0 { GPVAL = GPVAL & 0X0FFEF; } else { GPVAL = GPVAL | 0X0010; } } /*i2c总线开始操作*/ void I2C_START() { SDA(1,1); asm(\" nop 10\"); SCL(1); Delay(10); SDA(1,0); Delay(10); SCL(0); Delay(10); } void I2C_STOP() { SDA(1,0); asm(\" nop 100\"); SCL(1); Delay(10); SDA(1,1); Delay(10); SDA(1,1); Delay(10); SCL(0); Delay(10); } void I2C_SENDACK()/*发送应答位*/ { // SDA(1,1); SDA(1,0); Delay(10); SCL(1); Delay(10); SCL(0); Delay(10); } void I2C_SENDNOACK()/*发送非应答位*/ { SDA(1,1); Delay(10); SCL(1); Delay(10); SCL(0); Delay(10); } //====================================== unsigned char I2C_ACK()/*应答位检查*/ { unsigned char val; SCL(0); Delay(10); SCL(1); val=SDA(0,0); Delay(10); SCL(0); Delay(10); return val; } void I2C_WRITEBYTE(unsigned char out_byte) { unsigned char BitCnt; /*位数控制*/ unsigned char temp; /*中间变量控制*/ for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/ { if((out_byte<<BitCnt)&0x80) SDA(1,1); /*判断发送位*/ else SDA(1,0); Delay(10); SCL(1); /*置时钟线为高,通知被控器开始接收数据位*/ /*保证时钟高电平周期大于4.7μs*/ Delay(10); SCL(0); Delay(10); } /*************读返回来的应答******/ SCL(1); while(!SDA(0,0)); Delay(10); SCL(0); Delay(10); } void I2C_WRITECOMMAND(unsigned char DevAddr,unsigned char RegAddr, unsigned char data) { Delay(10); I2C_START(); I2C_WRITEBYTE(DevAddr); I2C_WRITEBYTE(RegAddr); I2C_WRITEBYTE(data); I2C_STOP(); Delay(10); } unsigned char ReadByte(void) /*读一个字节的数据,并返回该字节值*/ { unsigned char retc=0; unsigned char BitCnt; //SDA(1,1); for(BitCnt=0;BitCnt<8;BitCnt++) { SCL(0); /*置时钟线为低,准备接收数据位*/ Delay(10); /*时钟低电平周期大于4.7μs*/ SCL(1); /*置时钟线为高使数据线上数据有效*/ Delay(10); /*时钟高电平周期大于4.7μs*/ retc <<=1; if(SDA(0,0)) retc +=1; /*读数据位,接收的数据位放入retc中 */ Delay(10); } SCL(0); Delay(10); return(retc); } unsigned char I2C_READCOMMAND(unsigned char DevAddr,unsigned char RegAddr) { unsigned char i,read_value=0x00; I2C_START(); I2C_WRITEBYTE(DevAddr-1); I2C_WRITEBYTE(RegAddr); I2C_START(); I2C_WRITEBYTE(DevAddr); read_value=ReadByte(); I2C_SENDNOACK(); I2C_STOP(); return(read_value); } //======================================= //==============================THIS IS I2C CONTROL CODE END==================== main() { GPEN = 0X0030;//SET THE INT5 AS THE GPIO5 GPDIR = GPDIR | 0X0030; for(;;) { readback = I2C_READCOMMAND(0x8B,0x0A);//返回值总是0xff I2C_WRITECOMMAND(0x8A, 0x10, 0xff); I2C_WRITECOMMAND(0x8A, 0x11, 0xfe); I2C_WRITECOMMAND(0x8A, 0x12, 0xA0); I2C_WRITECOMMAND(0x8A, 0x13, 0xfc); I2C_WRITECOMMAND(0x8A, 0x14, 0xff); } } |
|
沙发#
发布于:2004-04-21 20:47
你用c写的?用什么实现的?
我用verilog写了个在fpga里实现这个 |
|
板凳#
发布于:2004-04-13 21:08
help
|
|