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

 
 
> обмен по 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
Ответов
vados
сообщение Mar 19 2010, 09:41
Сообщение #2





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



Вот весь код:
Код
#include <mega16.h>
void SPI_MasterTransmit(unsigned char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */    
while(!(SPSR & 0x80));
}
void main(void)
{
unsigned char i=0;
unsigned char mass_data [7] = { 0x0A, 0xff, 0x3A, 0xAf, 0xdd, 0xA0, 0xcf };

PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0xB0;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 500,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0xD1;
SPSR=0x00;

#asm
    in   r30,spsr
    in   r30,spdr
#endasm

#asm("sei")

while (1)
      {
      
      while(i<7)
        {
        PORTB=0x10;                              
        SPI_MasterTransmit( mass_data [i] );
        i++;        
        }
       PORTB=0;
       }


С функциями не стал пока заморачиваться - сразу в инициализации портов все прописал.
При обращении к микросхеме - сначала идет адрес чипа (восемь бит), затем гонятся данные, SS активируется только когда идут данные. На рисунке захватываются не восемь, а девять бит (мне кажется что это скорее всего опеачтка).

В протеусе все передается - единственное что смущает так это то что данные гонятся только побайтно через небольшие промежутки. И даже не знаю как будет реагировать на это микросхема.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Палыч
сообщение Mar 19 2010, 10:30
Сообщение #3


Гуру
******

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



Цитата(vados @ Mar 19 2010, 12:41) *
единственное что смущает так это то что данные гонятся только побайтно через небольшие промежутки.
Не смущайтесь - для SPI эти промежутки всего лишь несколько увиличивают время обмена, но - и только!
Go to the top of the page
 
+Quote Post



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

 


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


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