Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Въпроси за устройство за i2c мониторинг
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=4760
Страница 1 от 1

Автор:  volante [ Съб Сеп 08, 2007 5:23 pm ]
Заглавие:  Въпроси за устройство за i2c мониторинг

Здравейте,
трябва да направя устройство за I2C мониторинг, но започнах да се съмнявам дали ще заработи въобще.Приложил съм и схемата накрая.

Идеята ми е такава:
Използвам PIC16f876A с MSSP модул. Конфигурирам MSSP като "Slave mode (7-bit address) with Start and Stop bit interrupts enabled" когато приемам, когато предавам си е Master.
Конфигурирам INT0 да се генерира при преход от ниско към високо ниво.
Трябва да мога да чета съобщенията изпращани до всички адреси което правя така - след като получа прекъсване при наличие на Start bit чета I2C шината през RB2 при всеки преход 0->1 на RB0 и преди да се извърши сравняване на приетия адрес от I2C с този записан в SSPADD на PIC16f876A аз записвам в SSPADD резултатите от RB2 - на всяко ново съобщение променям записания в моята схема адрес и после оставям работата на хардуера за данните.

А ето и псевдо код за да е по ясно (надявам се:))

Код:
int8 temp_address = 0, temp_count = 0;

//interrupt vector
if(i2c_start bit){        //ако имаме I2C Start бит (ще се предава адрес)
   SetSlave;          //правя устройството Slave
   EnableExternalInterrupt;        //разрешавам INT0                     
   ClearI2CInterrupt;        //Чиситя I2C Interrupt flag         
}
if(ExternalInterrupt){        //ако имам INT0 (преход 0->1 на SCL)      
   temp_address |= ReadPortB2;        //чета PortB2 (т.е. чета SDA при преход 0->1 на SCL)
   temp_address <<= 1;        //и записвам съответния бит в temp_addres
   if(temp_count++ == 6){        //ако сме прочели 7 бита
      SSPADD = temp_address;        //записвам temp_addres в регистър SSPADD
      DisableExternalInterrupt;        //забранявам INT0
      temp_address = 0;      
      temp_count = 0;   
   }               
   ClearExternalInterrupt;        //чистя INT0 flag                  
}
//other interrupt conditions
   ...

main(){

initialize_rs232();
initialize_i2c();
clear_all_interrupts();

while(1){

i2cToRS232();        //пращам данните от I2C към RS232. Устройството е Slave

RS232toI2c();       //правя устройството Master и започвам да пращам
                       //данни от RS232 към I2C
ManipulateCommandsFromUser();   
BlinkLED();
}


Ето ги и моите тревоги :)
1.Значи не можах да намеря никакъв документ за режима "Slave mode (7-bit address) with Start and Stop bit interrupts enabled" и мога само да съдя индиректно за него от Master mode та ако може някой да помогне.

2.Дали като чета SCL и SDA шините през други портове (RB0 и RB2) не им променям нивата, тоест дали ще чета коректни данни и дали ще влияя на I2C шината. А и дали няма да товаря много RB0 и RB2. В I2C спецификацията нУлата е дефинирана между -0.5V и 1.5V а единицата между 3V до 5+V което отговаря на TTL за 0 и 1 но не съм сигурен.

3.Ако работи няма да мога да постигна някаква забележителна скорост (надявах се на 400kb/s но уви) а на мен ми трябва да е по стандарт и се надявам ако някой е работил повечко с PIC и I2C да даде съвет за оптимизация.

4.Дали ще изникнат някакви проблеми при постоянното превключване между Master/Slave.

5.Не можах да симулирам I2c устройство в Proteus7.1sp4 въпреки че изчетох наличния за него help.Просто слагам i2c модула без да променям нищо, той си работи като master, обаче като използвам симулацията да пращам адрес и данни нищо не става.

Ще се радвам на всякакви критики, корекции и забележки по темата:)

Прикачени файлове:
i2c.PNG
i2c.PNG [ 21.32 KiB | Прегледано 511 пъти ]

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/