اطلاعیه

Collapse
No announcement yet.

مشکل i2c نرم افزاری

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل i2c نرم افزاری

    سلام
    من از یک سایتی کد i2c نرم افزاری و گرفتم واسه eeprom ها ... تو همون سایت ds1307 رو هم با همون i2c راه اندازی کرده بود...
    من توی eeprom جواب گرفتم ولی انگار با ds1307 زیاد سازگار نیست یا مشکل کلا از ds1307 هست... تک و توک دیتارو از روی ds1307 اشتباه میخونه
    کد رو میزارم لطفا i2c رو چک کنید ببنید درسته ؟ من با avr studio کار میکنم
    اگه کد زیر اصلاح بشه به درد همه میخوره
    ممنون
    کد:
    #define SCLPORT	PORTB	//TAKE PORTD as SCL OUTPUT WRITE
    #define SCLDDR	DDRB	//TAKE DDRB as SCL INPUT/OUTPUT configure
    #define SCLPIN	PINB	//TAKE PORTD TO READ DATA
    
    #define SDAPORT	PORTB	//TAKE PORTD as SDA OUTPUT WRITE
    #define SDADDR	DDRB	//TAKE PORTD as SDA INPUT configure
    #define SDAPIN	PINB	//TAKE PORTD TO READ DATA
    
    
    #define SCL	5		//PORTD.0 PIN AS SCL PIN
    #define SDA	4		//PORTD.1 PIN AS SDA PIN
    
    
    #define SOFT_I2C_SDA_LOW	SDADDR|=((1<<SDA))
    #define SOFT_I2C_SDA_HIGH	SDADDR&=(~(1<<SDA))
    
    #define SOFT_I2C_SCL_LOW	SCLDDR|=((1<<SCL))
    #define SOFT_I2C_SCL_HIGH	SCLDDR&=(~(1<<SCL))
    کد:
    
    #include "i2csoft.h"
    
    #define Q_DEL _delay_loop_2(3)
    #define H_DEL _delay_loop_2(5)
    
    void I2CInit()
    {
    	SDAPORT&=(1<<SDA);
    	SCLPORT&=(1<<SCL);
    	
    	SOFT_I2C_SDA_HIGH;
    	SOFT_I2C_SCL_HIGH;
    	
    }
    void I2CStart()
    {
    	SOFT_I2C_SCL_HIGH;
    	H_DEL;
    	
    	SOFT_I2C_SDA_LOW;
    	H_DEL;
    }
    
    void I2CStop()
    {
    	SOFT_I2C_SDA_LOW;
    	H_DEL;
    	SOFT_I2C_SCL_HIGH;
    	Q_DEL;
    	SOFT_I2C_SDA_HIGH;
    	H_DEL;
    }
    
    uint8_t I2CWriteByte(uint8_t data)
    {
    	
    	uint8_t i;
    	
    	for(i=0;i<8;i++)
    	{
    		SOFT_I2C_SCL_LOW;
    		Q_DEL;
    		
    		if(data & 0x80)
    		SOFT_I2C_SDA_HIGH;
    		else
    		SOFT_I2C_SDA_LOW;
    		
    		H_DEL;
    		
    		SOFT_I2C_SCL_HIGH;
    		H_DEL;
    		
    		while((SCLPIN & (1<<SCL))==0);
    		
    		data=data<<1;
    	}
    	
    	//The 9th clock (ACK Phase)
    	SOFT_I2C_SCL_LOW;
    	Q_DEL;
    	
    	SOFT_I2C_SDA_HIGH;
    	H_DEL;
    	
    	SOFT_I2C_SCL_HIGH;
    	H_DEL;
    	
    	uint8_t ack=!(SDAPIN & (1<<SDA));
    	
    	SOFT_I2C_SCL_LOW;
    	H_DEL;
    	
    	return ack;
    	
    }
    
    
    uint8_t I2CReadByte(uint8_t ack)
    {
    	uint8_t data=0x00;
    	uint8_t i;
    	
    	for(i=0;i<8;i++)
    	{
    		
    		SOFT_I2C_SCL_LOW;
    		H_DEL;
    		SOFT_I2C_SCL_HIGH;
    		H_DEL;
    		
    		while((SCLPIN & (1<<SCL))==0);
    		
    		if(SDAPIN &(1<<SDA))
    		data|=(0x80>>i);
    		
    	}
    	
    	SOFT_I2C_SCL_LOW;
    	Q_DEL;						//Soft_I2C_Put_Ack
    	
    	if(ack)
    	{
    		SOFT_I2C_SDA_LOW;
    	}
    	else
    	{
    		SOFT_I2C_SDA_HIGH;
    	}
    	H_DEL;
    	
    	SOFT_I2C_SCL_HIGH;
    	H_DEL;
    	
    	SOFT_I2C_SCL_LOW;
    	H_DEL;
    	
    	return data;
    	
    }

    #2
    پاسخ : مشکل i2c نرم افزاری

    کسی نظری نداره ؟

    چطور با avr studio میشه پایه i2c سخت افزاریو عوض کرد ؟
    توی کدوریژن با .equ میشد ...
    من این i2c نرم افزاریو واسه اینکه از پایه های دیگه استفاده کردم لازم دارم...اگه کسی میدونه از خود twi اتمل استفاده کنم

    دیدگاه

    لطفا صبر کنید...
    X