21.10.2014, 18:35
|
|
Прохожий
Регистрация: 14.02.2007
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
I2C slave аппаратный на PIC16F873
I2C slave аппаратный на PIC16F873. У кого получилось реализовать в железе? Осваиваю шину I2C. Для начала только чтение, т.е. передача данных от подчиненного к ведущему (тоже PIC16F873). При совпадении адреса один раз все проходит нормально (т.е. после сброса и начальных установок). При повторном совпадении адреса в регистре SSPBUF оказывается записанным не адресный байт, а байт данных, загруженный последним при предыдущей передаче. В результате бит R/-W может оказаться ложным, и вместо передачи данных slave готовится их принимать и, естественно, зависает. Хотя в Протеусе в этом месте все в порядке; там другие заморочки со slave, которых нет в железе.
|
|
|
|
21.10.2014, 22:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2003
Адрес: Москва
Сообщений: 2,528
Сказал спасибо: 737
Сказали Спасибо 1,927 раз(а) в 799 сообщении(ях)
|
Re: I2C slave аппаратный на PIC16F873
Вот подпрограмма прерывания от аппаратного И2С
PHP код:
|
#INT_SSP
void SSP_isr(void)
{
state = i2c_isr_state();
if(state ‹= 0x80) //Master is sending data
{
if(state == 0x80)
incoming = i2c_read(2); //Passing 2 as parameter, causes the function to read the SSPBUF without releasing the clock
else
incoming = i2c_read();
if(state == 1) //First received byte is address
{
address = incoming;
}
else if(state ›= 2 && state != 0x80) //Received byte is data
{
buffer[address++] = incoming;
flag2 = 1;
}
}
if(state ›= 0x80) //Master is requesting data
{
i2c_write(buffer[0]);
i2c_write(buffer[1]);
i2c_write(buffer[2]);
}
flag1 = 1;
}
|
PHP код:
|
#use delay(crystal=12000000)
#use i2c(Slave,Fast,sda=PIN_C4,scl=PIN_C3,address=0x24, force_hw)
|
CCS. Кусок точно рабочий. На флаги не обращай внимание, это у меня там дальше использовалось.
__________________
Опыт - это школа, в которой человек узнает, каким дураком он был раньше.
|
|
|
|
22.10.2014, 11:03
|
|
Прохожий
Регистрация: 14.02.2007
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: I2C slave аппаратный на PIC16F873
Спасибо. Только я с ассемблером больше дружу. Но, попробую разобраться в логике.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:07.
|
|