智能车制作

标题: XS128 IIC 通讯源代码。 [打印本页]

作者: houhongyi    时间: 2013-1-26 00:26
标题: XS128 IIC 通讯源代码。
XS128 IIC 通讯源代码。哪位大侠能写一下啊。。这几天快疯了。。。自己写的一直不知道错那里了。。。

作者: 漫天飞舞    时间: 2013-3-16 15:13
同求啊,不知道怎么回事,用了51都可以,移植到XS128就出问题了
作者: ┦H3ゞ峰峰ぎ    时间: 2013-3-16 21:33

void iic_delay()        //5us延时
{
_asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop);
_asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop);
_asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop);
}

void delay_50us(uint t)
{
    uchar j;
        for(;t>0;t--)
        for(j=124;j>0;j--);
}

/*********************************************************************/
/**************               I2C通信部分              ***************/
/*********************************************************************/
void iic_start()               //函数功能:I2C通信开始
{
  scl_dir = 1;
  sda_dir = 1;
        sda=1;
    iic_delay();
        scl=1;
    iic_delay();
        sda=0;
        iic_delay();
       
}

void iic_stop()                //函数功能:I2C通信停止
{
   scl_dir = 1;
   sda_dir = 1;
        sda=0;
        iic_delay();
        scl=1;
        iic_delay();
        sda=1;
        iic_delay();
   scl_dir = 0;
   sda_dir = 0;
       
}

void iic_ack()                 //函数功能:I2C通信查应答位
{       
  char i=0;       
  scl_dir = 1;
  sda_dir = 0;
  scl = 0;
        iic_delay();
        iic_delay();
  scl = 1;
        iic_delay();
//  if(sda == 1)
//  {
//     for(;;);  
//  }
  while((sda==1)&&(i<250))i++;
        iic_delay();
  scl = 0;
        iic_delay();
        iic_delay();
}

void iic_write_byte(uchar wdata)//函数功能:向I2C从机写入一个字节
{
     uchar i,temp,temp1;
    scl_dir = 1;
    sda_dir = 1;
         temp1=wdata;
     for(i=0;i<8;i++)
        {
        scl = 0;
                iic_delay();
                temp=temp1;
                temp=temp&0x80;
                if(temp==0x80)
                        sda=1;                               
                else
                        sda=0;
                        iic_delay();
                        scl=1;
                        iic_delay();
                        scl=0;
                        iic_delay();
                        temp1=temp1<<1;
                       
        }
       sda_dir = 0;
}
char iic_read_byte(void)                         //函数功能:从I2C从机中读出一个字节
{
     uchar op;
         char data_data;
    scl_dir = 1;
    sda_dir = 0;
     for(op=0;op<8;op++)
        {       
            data_data=data_data<<1;
                sda=1;
                iic_delay();
                scl=0;            
                iic_delay();
                scl=1;               
                iic_delay();
                if(sda==1)
            data_data|=0x01;
        }
        return data_data;
}
void iic_write(uchar byte_add,uchar wdata)//函数功能:按地址写入一字节数据
{
     uchar t;
         t=(IIC_WRITE<<1);
         iic_start();
         iic_write_byte(t);
         iic_ack();
         iic_write_byte(byte_add);
         iic_ack();
         iic_write_byte(wdata);
         iic_ack();
         iic_stop();
}
char iic_read(uchar byte_add)                   //函数功能:按地址读出一字节数据
{
     uchar t;
         char m;
         t=(IIC_WRITE<<1);
         iic_start();
         iic_write_byte(t);
         iic_ack();
         iic_write_byte(byte_add);
         iic_ack();
         t=((IIC_READ<<1)|0x01);
         iic_start();
         iic_write_byte(t);
         iic_ack();
         m=iic_read_byte();
         //iic_ack();
         iic_stop();
         return m;
}
作者: forever、    时间: 2013-8-6 19:53
┦H3ゞ峰峰ぎ 发表于 2013-3-16 21:33
void iic_delay()        //5us延时
{
_asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm( ...

scl_dir = 1;这句的意思是把scl设置为输出口还是?scl_dir这个是什么意思?

作者: kunder    时间: 2013-8-12 11:55
┦H3ゞ峰峰ぎ 发表于 2013-3-16 21:33
void iic_delay()        //5us延时
{
_asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm( ...

赞一个

作者: yyyzrxh    时间: 2013-8-13 17:35
forever、 发表于 2013-8-6 19:53
scl_dir = 1;这句的意思是把scl设置为输出口还是?scl_dir这个是什么意思?

[attach]49761[/attach],自己研究研究吧

作者: ℡单身旅行    时间: 2013-8-22 08:24
sda_dir = 0;设为输入口,前面还有宏定义,他应该没有给出来而已~~~~
作者: 寒冬的朝阳    时间: 2013-8-30 19:34
yyyzrxh 发表于 2013-8-13 17:35
,自己研究研究吧

能问一下,这个iic是标准的吧。只要是iic器件就能用是吧。
作者: 卟李狗昕    时间: 2013-8-31 13:16
┦H3ゞ峰峰ぎ 发表于 2013-3-16 21:33
void iic_delay()        //5us延时
{
_asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm(nop); _asm( ...

"t=(IIC_WRITE<<1);"???在哪里?能发一份完整的程序参考下吗?1182932426@qq.com谢谢





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2