سلام
من از یک سایتی کد i2c نرم افزاری و گرفتم واسه eeprom ها ... تو همون سایت ds1307 رو هم با همون i2c راه اندازی کرده بود...
من توی eeprom جواب گرفتم ولی انگار با ds1307 زیاد سازگار نیست یا مشکل کلا از ds1307 هست... تک و توک دیتارو از روی ds1307 اشتباه میخونه
کد رو میزارم لطفا i2c رو چک کنید ببنید درسته ؟ من با avr studio کار میکنم
اگه کد زیر اصلاح بشه به درد همه میخوره
ممنون
من از یک سایتی کد 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; }
دیدگاه