Ведущий SPI для подчиненной синхронизации PIC18F4550 (C18) с использованием NETMF - PullRequest
2 голосов
/ 26 октября 2010

Устройство .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 МГц.

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

Ответы [ 2 ]

2 голосов
/ 06 марта 2011

На 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 на наличие ошибок.

0 голосов
/ 26 октября 2010

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

...