|
|
|
|
Сергей К: Залил на наш обменник Супергут! |
|
|
доброго времени суток, я не силен в контроллерах, но по пробую изложить суть вопроса. Есть PIC к нему подсоединена память и часы. причем если прописать #use i2c(MASTER, SLOW, FORCE_HW, sda=PIN_A2, scl=PIN_A1) то работают часы, но из памяти ничего не считывается, а если #use i2c(MASTER, SLOW, FORCE_HW, sda=PIN_B5, scl=PIN_B3) то наоборот, не работают часы, но читает из памяти... подскажите как решить данную проблему возможно как то менять настройку ПИНов? спасибо! |
|
|
Подключите и часы и память к одним и тем-же ножкам МК. Интерфейс I2C подразумевамет подключение в паралель нескольких устройств. |
|
|
а не перепаивая сделать невозможно? |
|
|
Точно не помню. Для UARTа можно сделать несколько разных, а вот для I2C точно не помню, посмотрите в документации по СCS в разделе про I2C, там тищите параметр на подобие STREAM="i2c_1" и подобное. Возможно есть еще функция для настройки I2C прямо в процессе работы. |
|
|
спасибо) надеюсь найду) |
|
|
придумал еще способ, не сильно оригинальный, т. к. не нашел как менять порты в процессе, я решил рядом с встроенным i2c интерфейсом вставить еще один, который будет работать с другими портами. Нашел в инете множество примеров, но компилятор ругается. #define SCL TRISA1 // шина I2C #define SDA TRISA2 // #define SCL_IN RA1 // #define SDA_IN RA2 // void i2c2_dly(void) { } void i2c2_start(void) { SDA = 1; // последовательность стартовых битов i2c i2c2_dly(); SCL = 1; i2c2_dly(); SDA = 0; i2c2_dly(); SCL = 0; i2c2_dly(); } //--------------------------------------------------------------------------------------- void i2c2_stop(void) { SDA = 0; // последовательность завершающих битов i2c i2c2_dly(); SCL = 1; i2c2_dly(); SDA = 1; i2c2_dly(); } unsigned char i2c2_read(char ack) { char x, d=0; SDA = 1; for(x=0; x8; x++) { d = 1; do { SCL = 1; } while(SCL_IN==0); // ждем любые длинные синхроимпульсы SCL i2c2_dly(); if(SDA_IN) d |= 1; SCL = 0; } if(ack) SDA = 0; else SDA = 1; SCL = 1; i2c2_dly(); // отсылаем (N)ACK бит SCL = 0; SDA = 1; return d; } bit i2c2_write(unsigned char d) { char x; static bit b; for(x=8; x; x--) { if(d&0x80) SDA = 1; else SDA = 0; SCL = 1; d = 1; SCL = 0; } SDA = 1; SCL = 1; i2c2_dly(); b = SDA_IN; // возможный ACK бит SCL = 0; return b; } пишет Undefined identifier TRISA2 Undefined identifier RA2 ну и еще много чего помимо, может подскажете как корректно заменить, чтобы работало, заранее спасибо |
|
|
искал как разными путями добиться работоспособности, но решил скинуть оригинальный пример |
|
|
Kirst0n: Undefined identifier TRISA2 это ссылка на регистр #byte TRISA = getenv("SFR:TRISA") Kirst0n: Undefined identifier RA2 это ссылка на ножку порта (бит) #bit RA2 = PORTA.2 |
|
|
все, разобрался, действительно просто реализуется #use i2c(MASTER, SLOW, FORCE_HW, sda=Device_SDA, scl=Device_SLC, STREAM=A) #use i2c(MASTER, SLOW, FORCE_HW, sda=PIN_A2 , scl=PIN_A1 , STREAM=B) |
|
|
|
|