19.05.2015, 12:25
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: FAQ по STM8
Там i2c прекрасно на прерываниях работает.
Хотя я скинул коды из готового проекта, который уже полтора года без выключения трудится. ))
Последний раз редактировалось Easyrider83; 19.05.2015 в 12:29.
|
|
|
|
19.05.2015, 12:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: FAQ по STM8
Ну вот, там работает, а у меня почему-то не заводится.
Хотя вроде бы все правильно сделал: настроил PB4/PB5 на opendrain выходы; установил их в 1; настроил тайминги (как в даташите + в примерах от STM аналогично сделано), запустил I2C. А вот при отправке ничего не выходит, хоть я и сделал как у STM (т.е. при поллинге флага BUSY устанавливаю флаг STOP): цикл по таймауту завершается, BUSY так и остается == 1.
В общем, похоже, надо делать софтовый I2C, коли осилить аппаратный не получается.
__________________
Союз Советских Социалистических Округов Северной Америки
Последний раз редактировалось eddy; 19.05.2015 в 12:42.
|
|
|
|
19.05.2015, 12:45
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: FAQ по STM8
Не кипиши. Давай свой проект. Может кто попробует у себя его? Я пока не могу. В Швеции в командировке.
|
|
|
|
19.05.2015, 12:48
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: FAQ по STM8
Лапки-то выжили?
Светиками попробуй помигать сначала, от питания к земле подёргать.
Вдруг статика....
|
|
|
|
19.05.2015, 13:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: FAQ по STM8
Попробую ногами подрыгать. Действительно - вдруг спалил (хотя как?)
Я сейчас на работе, а домашний компьютер выключен - пока файлы скинуть не могу. Вечерком дам ссылку.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
19.05.2015, 13:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: FAQ по STM8
Вот - код на сосфорже.
Собственно, инициализация:
Код:
|
void i2c_setup(){
// configure pins: PB5 - I2C_SDA; PB4 - I2C_SCL (both opendrain)
PORT(PB, ODR) |= GPIO_PIN4|GPIO_PIN5; // set to 1
PORT(PB, DDR) |= GPIO_PIN4|GPIO_PIN5;
PORT(PB, CR2) |= GPIO_PIN4|GPIO_PIN5; // fast mode
// Don't forget to connect pullup resistor to I2C foots
I2C_FREQR = 8; // 8MHz fmaster
I2C_TRISER = 9; // rise time 1000ns
I2C_CCRL = 0x28; // 100kHz
I2C_CCRH = 0;
I2C_ITR = 0; // disable all I2C interrupts
I2C_CR2 |= 4; // ACK
I2C_CR1 |= 1; // enable I2C
} |
А вот так я пытаюсь один байт отправить:
Код:
|
static U16 _c;
#define I2C_WAIT(evt) do{for(_c = 0; _c ‹ 16000; _c++){ \
if(evt) break;} if(_c == 16000) return ret;}while(0)
static U8 _d;
#define I2C_LINEWAIT() do{ for(_d = 0; _d ‹ 16; _d++){\
if(!(I2C_SR3 & 2)) break; I2C_CR2 |= 2;\
for(_c = 0; _c ‹ 1000; _c++) if(!(I2C_CR2 & 2)) break;} \
if(_d == 16) return I2C_LINEBUSY; }while(0)
i2c_status i2c_7bit_send_onebyte(U8 data){
i2c_status ret = I2C_TMOUT;
I2C_LINEWAIT();
I2C_CR2 |= 1; // send START
I2C_WAIT(I2C_SR1 & 1); // wait for SB
I2C_DR = addr7w;
ret = I2C_NOADDR;
I2C_WAIT((I2C_SR1 & 2) || I2C_SR2); // wait for ADDR
if(I2C_SR2){ // NACK or other error
ret = I2C_NACK;
goto endoftransmission;
}
ret = I2C_HWPROBLEM;
if(!(I2C_SR3 & 4)) goto endoftransmission; // interface is in receiver mode
I2C_WAIT((I2C_SR1 & 0x80) || I2C_SR2); // wait for TXE
if(I2C_SR2){
ret = I2C_NACK;
goto endoftransmission;
}
I2C_DR = data; // send data
I2C_WAIT((I2C_SR1 & 0x84 == 0x84) || I2C_SR2); // wait for TXE & BTF
if(!I2C_SR2) ret = I2C_OK;
else ret = I2C_NACK;
endoftransmission:
I2C_SR2 = 0; // clear all error flagss
I2C_CR2 |= 2; // set STOP
while(I2C_CR2 & 2); // wait for STOP sent
return ret;
} |
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
19.05.2015, 13:56
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: FAQ по STM8
Уже 10027627989 раз говорили, И2ЦЭ самый задротный, от рождения, априори. Тебе же не 4Мбит гонять туда-сюда, делай софтовый и не мучайся. Это если слэйв, тогда да, а на мастере - нефиг и мозги парить, оно того не стоит.
|
|
|
|
19.05.2015, 20:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от STM32F0
|
нефиг и мозги парить, оно того не стоит.
|
Вот вот, я тоже так решил и сразу написал софтверный, правда внутри все функции полностью на ассемблере )))
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
|
|
|
|
19.05.2015, 20:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 813 раз(а) в 590 сообщении(ях)
|
Re: FAQ по STM8
С софтовым I2C другая проблема может возникнуть, схожая с аппаратным: если изделие уже распаяно, то может оказаться так, что доступные для софтового I2C ноги уже использованы. Хотя, надо отдать должное разработчикам: даже на 20-ногом STM8S003 чуть ли не половина ног подключена к таймерам.
Жаль вот только, что DMA нет: на высоких скоростях МК тупо повиснет в обработчиках прерываний.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
19.05.2015, 20:37
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: FAQ по STM8
Под I2C использованы ноги с пометкой (Т), а не (HS), что означает открытый коллектор. Вообще все должно работать и с хардваром. Разбираться надо. Нельзя убегать от проблем.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:56.
|
|