shjdriver
驱动牛犊
驱动牛犊
  • 注册日期2003-04-01
  • 最后登录2008-04-02
  • 粉丝0
  • 关注0
  • 积分277分
  • 威望30点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
阅读:1134回复:2

I2C求助

楼主#
更多 发布于:2004-04-13 08:41
我作了一个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);
  }






}
shjdriver
驱动牛犊
驱动牛犊
  • 注册日期2003-04-01
  • 最后登录2008-04-02
  • 粉丝0
  • 关注0
  • 积分277分
  • 威望30点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-13 21:08
help
lyjyjj
驱动牛犊
驱动牛犊
  • 注册日期2003-10-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-21 20:47
你用c写的?用什么实现的?

我用verilog写了个在fpga里实现这个
游客

返回顶部