Перейти к содержанию
    

ADSP-2191 и FT2232 (SPI протокол)

Господа, а существует ли какая-нибудь библиотека, подключаемая в VisualDSP++ 3.5 для обмена данными по SPI на языке Си. Или необходимо вручную на ассемблере организовывать обмен сообщениями?

 

 

пока хочется написать простой тест типа : принять команду по USB (FT2232), затем получить ее по SPI дспшником и отправить сообщение обратно.

 

Был бы очень признателен, если бы вы показали мне пример на Си, или подсказали место, где его взять.

 

PS : с сайта analog.com Скачал апнот "Interfacing the ADSP-2191 to an AD7476 via SPI port", однако понимается с трудом :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть в VisualDSP++ 4.5.

Есть драйверы для всякой периферии, в т.ч. и для SPI

Еще там есть много example-ов, так что проблем с пониманием не возникнет

 

Есть в VisualDSP++ 4.5.

Есть драйверы для всякой периферии, в т.ч. и для SPI

Еще там есть много example-ов, так что проблем с пониманием не возникнет

 

Прошу прощения, не обратил внимания на тип процессора.

То что я написал справедливо для BlackFina, а не для 2191

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть в VisualDSP++ 4.5.

Есть драйверы для всякой периферии, в т.ч. и для SPI

Еще там есть много example-ов, так что проблем с пониманием не возникнет

 

Есть в VisualDSP++ 4.5.

Есть драйверы для всякой периферии, в т.ч. и для SPI

Еще там есть много example-ов, так что проблем с пониманием не возникнет

 

Прошу прощения, не обратил внимания на тип процессора.

То что я написал справедливо для BlackFina, а не для 2191

 

 

угу, к сожалению, у меня в проекте не BlackFin :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык, вроде бы там ничего особенного. Настраиваешь SPI-порт и работаешь с ним. Все регистры описаны, и вроде, даже по-русски. С FT2232, может, придется больше повозиться. Но там есть примеры для работы по SPI через интерфейс D2XX.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость mihask

Вот - но правда на асме. :)

______________________

 

При переходе на СИ для переключения страниц и записи/чтения

регистров используются вот эти функции (описание в мануале на компилятор)

 

sysreg_write ();

io_space_write();

io_space_read();

______________________

 

// ax0,ar,af и.т.д внутренние регистры adsp

______________________

 

 

/************************************************************************/

out_data_spi_8:

IOPG = SPI0_Controller_Page; // sysreg_write ()

AR = IO(RDBR0); /* Чтение SPI0 буфера приема */ // io_space_read()

AR = b#0000000001010110;

IO(SPIST0) = AR; /* ОЧИСТКА ОШИБОК */ // io_space_write()

 

AR = b#1111111100000000;

IO(SPIFLG0) = AR; /* запись во Flag Register */

 

ar = b#0101000000001001; /*длина слова 8 бит*/

IO(SPICTL0) = AR;

 

IO(TDBR0) = ax0;

ax0=0;

out_data_spi_8_1:

mx0=IOPG;

ar=IO(SPIST0);

ax1=ar;

ay0=0x9;

ar=ar and ay0; //поразрядное AND

ay0=1;

af=ar-ay0;

af=pass af; // pass команда для определения знака регистра

if eq jump out_data_spi_8_2; // если af == 0 то переход на метку

ar=ax0-1;

ax0=ar;

ar=pass ar;

if ne jump out_data_spi_8_1; // если ar != 0 то переход на метку

nop;

jump out_data_spi_8_3; // безусловный переход

out_data_spi_8_2:

nop;

out_data_spi_8_3:

rts;

 

 

 

 

/************************************************************************/

in_data_spi_8:

IOPG = SPI0_Controller_Page;

AR = b#0000000001010110;

IO(SPIST0) = AR; /* ОЧИСТКА ОШИБОК */

 

ar = b#0101000000001000; /*длина слова 8 бит прием*/

IO(SPICTL0) = AR;

AR = IO(RDBR0); /* Чтение SPI0 буфера приема */

in_data_spi_8_1:

ar=IO(SPIST0);

ax0=ar;

ay0=0x30;

ar=ar and ay0;

af=pass ar;

if eq jump in_data_spi_8_1;

AR = IO(RDBR0); /* Чтение SPI0 буфера приема */

rts;

 

 

 

 

 

 

 

/************************************************************************/

end_spi:

IOPG = SPI0_Controller_Page;

ax0 = b#0001000100001001;

IO(SPICTL0) = ax0;

AR = IO(RDBR0); /* Чтение SPI0 буфера приема */

IOPG = General_Purpose_IO;

AX0 = 0x0004; /* Turn ON FLAGS 0, 1, 2, and 3,4,5,6,7 */

IO(FLAGS) = AX0;

 

rts;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну с D2XX мне все более менее понятно, а вот с ADSP все не так очевидно.

 

Хотелось бы иметь что-то в духе D2XX функций SPI_read(..), SPI_Write(..) но только для VisualDSP.

 

 

все же конструкции типа:

    sysreg_write(sysreg_IOPG , SPI0_Controller_Page);        /* Select IO page */
    received_data[i] = io_space_read(RDBR0);    /* Read from SPI0 Receive Buffer Register */

 

менее удобны и наглядны, чем :

 

 recieved_data[i]=SPI_Read(SPI0)

 

 

наверное придется делать через io_space_read все же или самому писать класс :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Продолжим тему SPI

 

Есть EZ LITE BOARD ADSP-21990. Стоят 2 DACа, которые управляются по SPI.

С кодом на асме разобрался. Запрограмил ДСП все работает как надо. Решил ту же программу по функциональности написать на Си. Столкнулся с проблемой. Вот код:

 

#include <stdio.h>
#include <signal.h>
#include <adsp-21990.h>
#include <sysreg.h>
#include <math.h> 


//--------------------------------------------------------------------------
//   defines 
//--------------------------------------------------------------------------
#define Baud     4
#define point     4095
//--------------------------------------------------------------------------
//   GLOBAL VARIABLES
//--------------------------------------------------------------------------
int dm buffer[point]={  
                    #include "third.dat" 
                    };
int dm i;
int pm val;
int pm val_new;

//--------------------------------------------------------------------------
//   MAIN PROGRAM
//--------------------------------------------------------------------------
void main()
{

asm("nop;");
asm("nop;");    
    

sysreg_write(sysreg_IOPG, SPI0_Controller_Page);
io_space_write(SPICTL0, 0x150D);//write control register
//    15    14    13    12    11    10    9    8    7    6    5    4    3    2    1    0
//    0    0    0    1    0    1    0    1    0    0    0    0    1    1    0    1
// 0x150D

val = 0;
sysreg_write(sysreg_IOPG, SPI0_Controller_Page);                                 
val = io_space_read(SPIFLG0);    // read SPICTL0

val |= 0x000C;                        
io_space_write(SPIFLG0, val);        // write FLAG register, FLS1 anable PF2 as SYNC for DAC0

io_space_write(SPIBAUD0, Baud);    //write SPI Baud Rate 

val = io_space_read(SPICTL0);
val |= 0x4000;
io_space_write(SPICTL0, val);        //write 14 bit in CONTROL (SPE in ->SPI Module is enabled)

transmit_SPI();
}


void transmit_SPI(void)
{
while(1)
{
  for(i=0;i<point;i++)
  {
   sysreg_write(sysreg_IOPG, SPI0_Controller_Page);
   
   val = io_space_read(SPIFLG0);
   val ^= 0x0400;                        
   io_space_write(SPIFLG0, val);        //clear FLAG register, FLG1 clear PF2(SYNC) for DAC0
   
   io_space_write(TDBR0, buffer[i]);    //write TDBR0(transmit buffer)    
       
   asm("nop;");
   asm("nop;");
   
   val = 0x0001;
   
   while ( !(val_new &= val))        //Check SPIF bit. This bit is set when an SPI single-word 
   {                    //transfer is complete.
    asm("nop;");
    val_new = io_space_read(SPIST0);
   }//while
   val_new=0x0000;
*/
  
   val = io_space_read(SPIFLG0);
   val |= 0x0400;                    
   io_space_write(SPIFLG0, val);        //write FLAG register, FLG1 clear PF2(SYNC) for DAC0
  }//for
}//while
}

 

В файле "third.dat" находяться числа в таком виде

0x0001,
0x0002,
0x0003,

 

Проблема в том что при отладке в ДЖЕТАГе, да и вообще при работе, масив buffer[] или пустой или пересылаются совсем левые данные.

Такое впечатление что в память масив вообще не загружаеться...

В программе на асме этот масив завожу кодом:

.section/dm seg_dmdata;
    .var Dac_data[Number] = "third.dat";

при этом все в порядке... А вот с программой на Си незнаю что делать... Подскажите плз...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...