2016-05-30 2 views
1

Я пытаюсь установить связь SPI с PIC18F452 от Microchip, чтобы отправить 8-байтовый массив на шину (= передача всех байтов одновременно). Вот пример того, что мой массив выглядит следующим образом:Отправка 8-байтового массива в SPI

array 0x0080 byte[8] 
array[0] 0x0080 0x01 
array[1] 0x0081 0x01 
array[2] 0x0082 '\0' 
array[3] 0x0083 0x01 
array[4] 0x0084 0x01 
array[5] 0x0085 0x01 
array[6] 0x0086 0x01 
array[7] 0x0087 '\0' 

значения поступают из входного сигнала (звукового файла, часов и т.д.) и получили на PORTDbits.RD0 выполнить массив. Значения всегда 1 или 0 и ничего больше.

Во-первых, я начал с отправки одного байта в то время с putcSPI(). Когда я выполняю массив, я посылаю один байт в SPI, и результаты соответствуют.

Затем я попытался отправить все байты сразу, используя putsSPI() как следующие:

/// SEND DATA TO SPI 
SPI_INT = 0;  // Enable SS 
putsSPI(array); 
SPI_INT = 1;  // Disable SS 
delay_ms();  // Delay 

Но передача кадра прекращается, когда я сталкиваюсь с 0 (рассматривается как конец массив, так что это нормально). И мой кадр делится на куски.

например, для массива отображается выше, у меня есть на шине SPI «1 1», а затем, следующие значения из кадров, которые следуют

Это, как говорится, я думал о преобразовании данных от двоичного до шестнадцатеричного (или целого), а затем отправить его в SPI. Я пробовал несколько методов конверсии, найденных здесь, но до сих пор ни один из них не был успешным.

Есть ли решение отправить непосредственно полный массив на шину, или у кого-нибудь есть идея о том, как выполнить преобразование в данном конкретном случае?

Большое спасибо заранее!

+1

Зачем вам отправлять 8 байтов, которые могут содержать только одно из двух значений? Вы можете тривиально упаковать значения в один байт. – EOF

+0

Проблема решена с использованием совершенно другого метода. Опубликует решение, которое я использовал позже – Daymov

+0

Если 'putsSPI' ожидает строку с нулевым завершением, она, очевидно, будет отправлять только символы до первого нулевого символа. Почему бы вам просто не отправить один байт за раз? Как @EOF уже написал, 8 бит - это один байт, вы уверены, что вам не нужно отправлять только одному байту получателю? – Groo

ответ

0

В конце концов и для достижения моей цели, я полностью изменил свой метод для решения этой проблемы.

Я по-прежнему использую SPI для связи. Но вместо массива я сохраняю значение моего входного сигнала (после всех операций, которые я применяю к нему) в значении. Это значение позже будет разделено на две части, которые будут отправляться по одному байту на шину.

// Definition 
unsigned int value = 0; 
unsigned char value_byte1 = 0; 
unsigned char value_byte2 = 0; 
unsigned int onTheBus_byte1 = 0; 
unsigned int onTheBus_byte2 = 0; 

// In main function, the value is modified using a counter (value++;) 

// Transfer to SPI 
value_byte1 = value >> 8; 
value_byte2 = value & 0xFF; 

SPI_INT = 0; // Enable SS 
onTheBus_byte1 = WriteSPI(value_byte1); 
onTheBus_byte2 = WriteSPI(value_byte2); 
SPI_INT = 1; // Disable SS 

Так что, если я получаю:

value = 1505 (= 0x05E1) 

в главном цикле, то

value_byte1 = 0x05 
value_byte2 = 0xE1 

(Этот код был проверен на Proteus, и я вижу как байт на Отладчик SPI, когда значение записано на шине)

В случае, если мне нужно использовать значение, скажем, на другом рисунке, я собираю две части после того как я прочитал их:

value = (value_byte1 << 8) | value_byte2; 
Смежные вопросы