реклама на сайте
подробности

 
 
> обмен по spi, как передать по spi 52 бита
vados
сообщение Mar 19 2010, 08:10
Сообщение #1





Группа: Участник
Сообщений: 5
Регистрация: 19-12-08
Пользователь №: 42 609



Кто может - помогите! Есть проблема при передаче по SPI. Нужно организовать передачу 52 бит для управления аудиопроцессором lc75373(только в одну сторону).
В принципе код есть - точная копия из ДШ. Но при прогоне в PROTEUS, между байтами получается промежуток, как понял из ДШ после передачи одного байта генератор SPI останавливается и из-за этого получаются промежутки, или это глюк PROTEUS?

Код
unsigned char i=0;
unsigned char mass_data [7] = { 0x0A, 0xff, 0x3A, 0xAf, 0xdd, 0xA0, 0xcf };// mass_data - массив с данными вместо 52 56бит(пока)
void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;

while (1)
      {
      while(i<7)
        {
        PORTB=0x10;// PORTB.4 - вывод SS - chip select                              
        SPI_MasterTransmit( mass_data [i] );
        i++;        
        }
        PORTB=0;
}


Можно ли это сделать аппаратно, проблема еще в том что кол-во бит не кратно восьми, или лучше все это делать программно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Andron_
сообщение Mar 19 2010, 09:52
Сообщение #2


.NET developer
***

Группа: Свой
Сообщений: 218
Регистрация: 20-10-07
Из: Новосибирск
Пользователь №: 31 532



Цитата
данные гонятся только побайтно через небольшие промежутки

как написали, так и гонятся.
сначала начинается передача, затем вы ждете окончания, и лишь потом идете на начало цикла, проверяете условие, выставляете порт в нужное состояние...
в MasterTransmit если строчки кода местами поменять, задержка между байтами будет меньше.
Go to the top of the page
 
+Quote Post
vados
сообщение Mar 19 2010, 13:30
Сообщение #3





Группа: Участник
Сообщений: 5
Регистрация: 19-12-08
Пользователь №: 42 609



Цитата(Andron_ @ Mar 19 2010, 13:52) *
как написали, так и гонятся.
сначала начинается передача, затем вы ждете окончания, и лишь потом идете на начало цикла, проверяете условие, выставляете порт в нужное состояние...
в MasterTransmit если строчки кода местами поменять, задержка между байтами будет меньше.

в MasterTransmit никак нельзя менять строчки :
Код
void SPI_MasterTransmit(unsigned char cData)
{  
while(!(SPSR & 0x80));//если поменять, то этот цикл не завершится никогда! Это условие проверяет закончена ли передача байта,
SPDR = cData;           //а она даже не начнется если в SPDR ничего не положили
}
Go to the top of the page
 
+Quote Post
Палыч
сообщение Mar 19 2010, 14:05
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(vados @ Mar 19 2010, 16:30) *
в MasterTransmit никак нельзя менять строчки :
Код
void SPI_MasterTransmit(unsigned char cData)
{  
while(!(SPSR & 0x80));//если поменять, то этот цикл не завершится никогда! Это условие проверяет закончена ли передача байта,
SPDR = cData;           //а она даже не начнется если в SPDR ничего не положили
}
Зря Вы так - категорично. Andron_ хотел сказать, что можно проверять: закончилась ли предыдущая передача байта и можно ли передавать следующий байт - ведь предыдущая передача когда-то закончится и этот флаг взведётся (а сбросится он по занесению данных в SPDR)... Проблема только с установкой этого байта ДО первой передачи... Но, и это легко обходится, если передать в начале программы один байт без проверок на окончание передачи "в пустоту" (т.е. без сигнала SS).
Всё это актуально, если Вы ещё "смущаетесь" пауз между передачами байтов.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 19:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01416 секунд с 7
ELECTRONIX ©2004-2016