2010-10-26 6 views
2

Устройство .NET Micro Framework (в этом случае ChipworkX) отправляет байт через интерфейс SPI в PIC18F. Имея PIE1bits.SSPIE включен, следующий код выполняется на interrrupt:SPI master to PIC18F4550 ведомая синхронизация (C18) с использованием NETMF

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   кГц, тогда как ПОС работает на частоте 8   МГц.

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

+0

Какие у вас установлены регистры SSPSTAT и SSPCON1? Вы также убедились, что выводы SCK, SDO, SDI и ~ SS правильно настроены как вход или выход? Вы используете булавку SS? – MSumulong

ответ

0

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

+0

Эта задержка была просто использована в качестве индикатора состояния, чтобы привести свинец немного дольше, чтобы человеческий глаз мог быть свидетелем. – Joost

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

 Смежные вопросы

  • Нет связанных вопросов^_^