这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » easyarm2200,i2c 关于周立功easyarm2200上i2c的有子地

共4条 1/1 1 跳转至

easyarm2200,i2c 关于周立功easyarm2200上i2c的有子地址读多个子节的问题

院士
2006-09-17 18:14:16     打赏
easyarm2200,i2c 关于周立功easyarm2200上i2c的有子地址读多个子节的问题



关键词: easyarm2200     关于     周立功     立功     地址         

院士
2006-12-22 22:43:00     打赏
2楼
问 请问周立功的工程师和各位使用easyARM2200的大虾:
在下边的中断服务程序中,如果主程序调用uint8  IRcvByte(uint8 sla, uint8 *dat)
执行有子地址的多子节读操作,出现的状态次序是不是0x08,0x18,0x28,0x10,0x40,0x50,0x50.....0x58???
如果是这样的,在状态0x10(重新启动总线后)的响应中是不是应该发送“子地址+读”的操作?,可是我看程序只是发送子地址,而没有将d0置1?
void  __irq  IRQ_I2C(void)
{  uint8  sta;

   sta = I2STAT;                    // 读出I2C状态字
   switch(sta)
   {  case  0x08:                   // 己发送起始条件
            if(1==I2C_suba_en) I2DAT = I2C_sla&0xFE;    // 指定子地址读时,先写入地址
              else I2DAT = I2C_sla;                     // 否则直接发送从机地址
            I2CONCLR = 0x28;        // SI=0
            break;
            
      case  0x10:
            I2DAT = I2C_sla;        // 重启动总线后,发送从地址
            I2CONCLR = 0x28;        // SI=0
            break;
   
      case  0x18:                   // 已发送SLA+W,并已接收应答
            if(0==I2C_suba_en)      // 无子地址,则直接发送数据
            {  if(I2C_num>0)
               {  I2DAT = *I2C_buf++;
                  I2CONCLR = 0x28;
                  I2C_num--;
               }
               else
               {  I2CONSET = 0x10;  // 无数据发送,结束总线
                  I2CONCLR = 0x28;
                  I2C_end = 1;      // 设置总线操作结束标志
               }
               break;
            }
            if(1==I2C_suba_en)      // 发送子地址
            {  I2DAT = I2C_suba;
               I2CONCLR = 0x28;
            }
            if(2==I2C_suba_en)
            {  I2DAT = I2C_suba;
               I2CONCLR = 0x28;
               I2C_suba_en = 0;     // 子地址己处理
            }
            break;
            
      case  0x28:                   // 已发送I2C数据,并接收到应答
            if(0==I2C_suba_en)      // 无子地址,则直接发送数据
            {  if(I2C_num>0)
               {  I2DAT = *I2C_buf++;
                  I2CONCLR = 0x28;
                  I2C_num--;
               }
               else
               {  I2CONSET = 0x10;  // 无数据发送,结束总线
                  I2CONCLR = 0x28;
                  I2C_end = 1;
               }
               break;
            }
            if(1==I2C_suba_en)      // 若是指定地址读,则重新启动总线
            {  I2CONSET = 0x20;
               I2CONCLR = 0x08;
               I2C_suba_en = 0;     // 子地址己处理
            }
            break;
   
   
      case  0x20:
      case  0x30:
      case  0x38:
            I2CONCLR = 0x28;        // 总线进入不可寻址从模式
            I2C_end = 0xFF;         // 总线出错,设置标志
            break;
   
   
      case  0x40:                   // 己发送SLA+R,并已接收到应答
            if(1==I2C_num)          // 最后一字节,接收数据后发送非应答信号
            {  I2CONCLR = 0x2C;     // AA=0,接收到数据后产生非应答
            }
            else                    // 接收数据并发送应答信号
            {  I2CONSET = 0x04;     // AA=1,接收到数据后产生应答
               I2CONCLR = 0x28;
            }
            break;
            
      case  0x50:
            *I2C_buf++ = I2DAT;     // 读取数据
            I2C_num--;
            if(1==I2C_num)
            {  I2CONCLR = 0x2C;     // AA=0,接收到数据后产生非应答
            }
            else
            {  I2CONSET = 0x04;     // AA=1,接收到数据后产生应答
               I2CONCLR = 0x28;
            }
            break;
      
      case  0x58:
            *I2C_buf++ = I2DAT;     // 读取最后一字节数据
            I2CONSET = 0x10;        // 结束总线
            I2CONCLR = 0x28;
            I2C_end = 1;
            break;
      
      case  0x48:
            I2CONCLR = 0x28;        // 总线进入不可寻址从模式
            I2C_end = 0xFF;
            break;
            
      default:
            break;
   }
   

   VICVectAddr = 0x00;              // 中断处理结束
}


1: 这个中断程序一点问题也没有,我用得好好,问题出在你自己的接口函数上 2: re可以参考LPC2000 FAQ 341问和347问


菜鸟
2008-01-25 14:02:02     打赏
3楼
ARM编程:低价转让EasyARM2200开发板 [jianghy2008] 2006-7-20 17:50:31

低价转让EasyARM2200开发板
低价转让EasyARM2200开发板 650元
原价980元 无用过,无损伤,光盘,资料齐全

联系13167328210 只限北京


菜鸟
2008-01-31 22:05:52     打赏
4楼
北京驰龙电子技术有限公司专营世界各国名牌IC.如MAXIM TI ADI PHILIPS ISSI XILINX ATMEL NS ISSI 等 
www.chilon.cn

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]