完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在学习ARM,像在ARM上练习一下IIC,之前在51上和AVR上都玩过IIC,都没有遇到什么困难,但是这次在ARM上我彻底跪了,搞了3天都没有搞好,我自己写的程序没有问题,调试也没有报错,硬件电路也没有问题,但是就是仿真不到理想的结果,求哪位大侠指教一下,万分感谢!!!下面是我的代码,补充一下,我用IAR调试程序,当我按F10单步调试时,程序一直停在一个地方不走,不知道是怎么回事。 #include #define uint unsigned int #define uchar unsigned char #define AA 1<<2 #define SI 1<<3 #define STO 1<<4 #define STA 1<<5 #define I2EN 1<<6 #define FOSC 12000000 #define SULV 100000 void delay(uint a) //延时函数 { uint i,j; for(i=0;i for(j=0;j<120000;j++); } void init_iic(void) //初始化IIC,设置为100K的速率 { PINSEL0=0X00000050; //初始化端口,设置为IIC接口 PINSEL1=0X00000000; I2C0CONCLR=AA|SI|STA|STO; I2C0CONSET=I2EN; I2C0SCLH=15 // 12M/4/100k=30 I2C0SCLL=15; } void iic_star(void) //发送起始信号 { I2C0CONSET=STA; //I2C0CONCLR=SI; while((I2C0STAT)!=0X08); //等待起始信号发送完 I2C0CONCLR=STA; } void iic_restar(void) //重复起始信号 { I2C0CONSET=STA; while(I2C0STAT!=0X10); //等待重复起始信号发送完毕 I2C0CONCLR=STA; } void iic_stop(void) //发送停止信号 { I2C0CONSET=STO; I2C0CONCLR=SI; } void iic_writebyte(uchar data) //向24C02里写一个字节 { I2C0DAT=data; I2C0CONCLR=SI; } void write_addr_modle(uchar modle) //写24C02器件地址,这里我把24C02的地址为A0、A1、A2都接地了 { iic_writebyte(0xa0+modle); if(modle) //如果是modle为1,代表要读24C02里的数据 { while(I2C0STAT!=0X40); //等待24C02的地址和读发送并接受应答 } else //如果是modle为0,代表要向24C02里写数据 { while((I2C0STAT)!=0X18); //等待24C02的地址和写发送并接受应答 } } void write_data(uchar data) { iic_writebyte(data); //写数据 while(I2C0STAT!=0X28); //等待数据写完并接收应答 } void write24c02(uchar addr,uchar *p) //向24C02的addr地址写指针p里的数据 { //uchar i; iic_star(); write_addr_modle(0); //发送器件地址 write_data(addr); // 发送器件内部存储地址 while(*p!=' |