这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 铁电真铁,FM24C256写不进去,贴出程序-M32

共4条 1/1 1 跳转至

铁电真铁,FM24C256写不进去,贴出程序-M32

菜鸟
2010-04-22 12:59:22     打赏
#define uint8 unsigned char #define uint16 unsigned int #define uint32 unsigned long #define SETBIT(x, y) (x |= y) #define CLEARBIT(x, y) (x &= ~y) #define CHECKBIT(x, y) (x & y) #define PCBIT7 0x80 #define PCBIT6 0x40 #define PCBIT5 0x20 #define PCBIT4 0x10 #define PCBIT3 0x08 #define PCBIT2 0x04 #define PCBIT1 0x02 #define PCBIT0 0x01 /*------------- FM24C256 --------------*/ #define SCL PCBIT0 #define SDA PCBIT1 #define I2CPORT PORTC #define I2CPORTD DDRC #define I2CPORTIN PINC /*------------------------------------------------------------- 2010-04-16 CPU:Atmega32 晶振:4MHz FM24C256-GTR I/O模拟I2C时序控制铁电子程序 ---------------------------------------------------------------*/ #define I2CReadCMD 0xa1 #define I2CWriteCMD 0xa0 #define SomeNops NOP();NOP();NOP() uint8 I2CSlaveAckFlag=0; void I2CPORTInit (void) { SETBIT(I2CPORTD,SCL); //设置SCL为输出 NOP();NOP();NOP(); SETBIT(I2CPORTD,SDA); //设置SDA为输出 NOP();NOP();NOP(); SETBIT(I2CPORT,SCL); //SCL=1 NOP();NOP();NOP(); SETBIT(I2CPORT,SDA); //SDA=1 NOP();NOP();NOP(); } void I2CStart (void) { SETBIT(I2CPORTD,SDA); //设置SDA为输出 NOP();NOP();NOP(); SETBIT(I2CPORT,SCL); //SCL=1 SomeNops; SETBIT(I2CPORT,SDA); //SDA=1 SomeNops; CLEARBIT(I2CPORT,SDA); //SDA=0 SomeNops; CLEARBIT(I2CPORT,SCL); //SCL=0 SomeNops; } void I2CStop (void) { SETBIT(I2CPORTD,SDA); //设置SDA为输出 CLEARBIT(I2CPORT,SCL); //SCL=0 SomeNops; CLEARBIT(I2CPORT,SDA); //SDA=0 SomeNops; SETBIT(I2CPORT,SCL); //SCL=1 SomeNops; SETBIT(I2CPORT,SDA); //SDA=1 SomeNops; CLEARBIT(I2CPORT,SCL); //SCL=0 SomeNops; } void I2CHostAck (void) { SETBIT(I2CPORTD,SDA); //设置SDA为输出 CLEARBIT(I2CPORT,SCL); //SCL=0 SomeNops; CLEARBIT(I2CPORT,SDA); //SDA=0 SomeNops; SETBIT(I2CPORT,SCL); //SCL=1 SomeNops; CLEARBIT(I2CPORT,SCL); //SCL=0 SomeNops; } void I2CSlaveAck (void) { SETBIT(I2CPORTD,SDA); //设置SDA为输出 CLEARBIT(I2CPORT,SCL); //SCL=0 SomeNops; SETBIT(I2CPORT,SDA); //SDA=1 SomeNops; SETBIT(I2CPORT,SCL); //SCL=1 CLEARBIT(I2CPORTD,SDA); //设置SDA为输入 SomeNops; I2CSlaveAckFlag=(I2CPORTIN&0x02); CLEARBIT(I2CPORT,SCL); //SCL=0 SomeNops; } void I2CNoAck(void) { SETBIT(I2CPORTD,SDA); //设置SDA为输出 SETBIT(I2CPORT,SDA); //SDA=1 SomeNops; SETBIT(I2CPORT,SCL); //SCL=1 SomeNops; CLEARBIT(I2CPORT,SCL); //SCL=0 SomeNops; } /*----------------------------------------------- 读一个字节从I2C总线上 -----------------------------------------------*/ uint8 Read1Byte2I2c (void) { uint8 I2CByte=0; uint8 I2CByteTemp=0; uint8 i=0; SETBIT(I2CPORTD,SDA); //设置SDA为输出 SETBIT(I2CPORT,SDA); //SDA=1 SomeNops; CLEARBIT(I2CPORTD,SDA); //设置SDA为输入 SomeNops; for(i=0;i=1 ; I2CByte |= I2CByteTemp; CLEARBIT(I2CPORT,SCL); //SCL=0 SomeNops; } return (I2CByte); } /*----------------------------------------------- 写一个字节到I2C总线上 -----------------------------------------------*/ void Write1Byte2I2C (uint8 I2CByte) { uint8 i=0; SETBIT(I2CPORTD,SDA); //设置SDA为输出 for(i=0;i #include #include #include "PUBLIC.H" #include "MAIN.H" extern void I2CPORTInit (void); extern uint8 FM24C256Read1Byte (uint16 Address); extern void FM24C256Read (uint16 Address , uint16 ByteNumber , uint8 * DataPoint); extern void FM24C256Write (uint16 Address , uint16 ByteNumber , uint8 * DataPoint); #define TestAddress 0x0010 uint8 TestTemp1=0; uint8 TestTemp2=0; uint8 TestArray1[10]={0,0,0,0,0,0,0,0,0,0}; void port_init(void) { PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } // void main(void) { init_devices(); //SETBIT(I2CPORTD,SDA); //SETBIT(I2CPORT,SDA); //CLEARBIT(I2CPORTD,SDA); //if( CHECKBIT(I2CPORTIN,SDA) ) //TestTemp1=0; I2CPORTInit(); TestTemp2=FM24C256Read1Byte(TestAddress); TestTemp1=0; TestTemp1=0x0f; FM24C256Write(TestAddress,1,&TestTemp1); TestTemp1=0; TestTemp2=FM24C256Read1Byte(TestAddress); TestTemp1=0; TestTemp1=0; } ------------------------------------------------------------- 以上是我的程序,现在从任何地址读出一个字节都是0xff,写入0x0f后读出还是0xff,一开始我认为是读对了,因为一般储存器没写过应该是0xff的,但是仔细观察有无应答信号,在读FM24C256单个字节的函数(FM24C256Read1Byte)那里设了断点,发现就只有发送第一个命令字节是有正确应答的(低电平),后边都是高电平。所以好像读也不对。SomeNops试过5个NOP也不行,我用的4MHZ,那么一条NOP就是1/4微妙,看了FM24C256数据手册,最快能支持1MHZ。有用过铁电的朋友请发表下看法。谢谢。 我用的ICCAVR 7.22+AVRStudio最新版+JTAG ICE 主函数我用的向导生成然后加入自己的代码,因为看见向导那里可以设置晶振频率。



关键词: 铁电     真铁     FM24C256     写不     进去     贴出         

菜鸟
2010-04-28 14:47:09     打赏
2楼

这个格式...

怎么全黏在一块了...


菜鸟
2010-04-28 14:51:48     打赏
3楼
如果一条NOP就是1/4微妙,5个nop也就1微秒多一点吧,24C256貌似间隔是4us和4.7us的吧?是不是短了点?

菜鸟
2010-04-28 14:52:23     打赏
4楼
如果一条NOP就是1/4微妙,5个nop也就1微秒多一点吧,24C256貌似间隔是4us和4.7us的吧?是不是短了点?

共4条 1/1 1 跳转至

回复

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