Синхронизация главного устройства SPI с подчиненным устройством PIC18F4550 (C18) с использованием NETMF

Устройство .NET Micro Framework (в данном случае ChipworkX) отправляет байт через интерфейс SPI в PIC18F. При включенном PIE1bits.SSPIE при прерывании выполняется следующий код:

void high_isr (void)
{
     PIE1bits.SSPIE = 0;
     PIR1bits.SSPIF = 0; //Clear interrupt flag.
     LATDbits.LATD5 = 1; //Enables LED for high interrupt activity.
     while ( !SSPSTATbits.BF ); //Wait until cycle complete
     red_byte_array[1] = SSPBUF;
     SSPBUF = 0x00;
     LATDbits.LATD5 = 0;
     PIE1bits.SSPIE = 1;
}

При отправке одного и того же байта несколько раз данные не читаются последовательно. И ведущий, и подчиненный настроены на низкий уровень простоя часов и синхронизацию данных по переднему фронту. Я не использую линию выбора чипа, потому что это прямая связь. Наконец, мастер отправляет данные на частоте 100 кГц, в то время как PIC работает на частоте 8 МГц.

Как улучшить и/или исправить этот код?


person Joost    schedule 26.10.2010    source источник
comment
Какие значения установлены в ваших регистрах SSPSTAT и SSPCON1? Вы также убедились, что контакты SCK, SDO, SDI и ~SS правильно настроены как вход или выход? Вы используете контакт ~SS?   -  person MSumulong    schedule 02.11.2010


Ответы (2)


На PIC16F886/7:

Если вы не используете /SS, то данные изменяются по переднему фронту и отбираются по заднему фронту, для SCK на холостом ходу при 0: CKE = 0, CKP = 0 (или 1), SMP = 0.

Байт, перемещаемый из регистра сдвига в регистр буфера, вызывает BF бит и SSPIF прерывание, поэтому вы обычно не зацикливаетесь в прерывании, ожидая BF.

Не должно быть необходимости отключать прерывания SSP (SSPIE = 0), но вам, вероятно, потребуется очистить SSPIF перед возвратом из прерывания.

Я полагаю, вы должны, на прерывании SSP (SSPIF = 1):

red_byte_array[x] = SSPBUF
SSPIF = 0

Возможно, вам потребуется проверить WCOL и SSPOV на наличие ошибок.

person Robert Forsyth    schedule 06.03.2011

Учитывая, что ваш PIC имеет только (8 МГц / 100 кГц) 80 циклов для ответа, Delay1KTCYx() кажется довольно длинным.

person Eric Towers    schedule 26.10.2010
comment
Эта задержка использовалась просто как индикатор состояния, держите светодиод немного дольше, чтобы человеческий глаз мог его увидеть. - person Joost; 26.10.2010