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

 
 
 
Reply to this topicStart new topic
> ADSP-2191 и FT2232 (SPI протокол), вопрос новичка
skopus
сообщение Jan 15 2007, 10:38
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124



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


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

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

PS : с сайта analog.com Скачал апнот "Interfacing the ADSP-2191 to an AD7476 via SPI port", однако понимается с трудом sad.gif
Go to the top of the page
 
+Quote Post
IgorV
сообщение Jan 15 2007, 15:06
Сообщение #2





Группа: Новичок
Сообщений: 11
Регистрация: 24-01-06
Пользователь №: 13 549



Есть в VisualDSP++ 4.5.
Есть драйверы для всякой периферии, в т.ч. и для SPI
Еще там есть много example-ов, так что проблем с пониманием не возникнет

Цитата(IgorV @ Jan 15 2007, 15:02) *
Есть в VisualDSP++ 4.5.
Есть драйверы для всякой периферии, в т.ч. и для SPI
Еще там есть много example-ов, так что проблем с пониманием не возникнет


Прошу прощения, не обратил внимания на тип процессора.
То что я написал справедливо для BlackFina, а не для 2191
Go to the top of the page
 
+Quote Post
skopus
сообщение Jan 16 2007, 10:05
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124



Цитата(IgorV @ Jan 15 2007, 15:06) *
Есть в VisualDSP++ 4.5.
Есть драйверы для всякой периферии, в т.ч. и для SPI
Еще там есть много example-ов, так что проблем с пониманием не возникнет

Цитата(IgorV @ Jan 15 2007, 15:02) *

Есть в VisualDSP++ 4.5.
Есть драйверы для всякой периферии, в т.ч. и для SPI
Еще там есть много example-ов, так что проблем с пониманием не возникнет


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



угу, к сожалению, у меня в проекте не BlackFin sad.gif
Go to the top of the page
 
+Quote Post
K A A
сообщение Jan 16 2007, 11:43
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 15-06-06
Пользователь №: 18 069



Дык, вроде бы там ничего особенного. Настраиваешь SPI-порт и работаешь с ним. Все регистры описаны, и вроде, даже по-русски. С FT2232, может, придется больше повозиться. Но там есть примеры для работы по SPI через интерфейс D2XX.
Go to the top of the page
 
+Quote Post
mihask
сообщение Jan 16 2007, 12:05
Сообщение #5


Частый гость
**

Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905



Вот - но правда на асме. smile.gif
______________________

При переходе на СИ для переключения страниц и записи/чтения
регистров используются вот эти функции (описание в мануале на компилятор)

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;
Go to the top of the page
 
+Quote Post
skopus
сообщение Jan 16 2007, 12:08
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124



Ну с 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 все же или самому писать класс sad.gif
Go to the top of the page
 
+Quote Post
skopus
сообщение Jan 16 2007, 13:17
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124



Цитата(mihask @ Jan 16 2007, 12:05) *
Вот - но правда на асме. smile.gif
______________________


спасибо
Go to the top of the page
 
+Quote Post
bureau
сообщение Nov 2 2007, 17:39
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 625
Регистрация: 22-02-07
Пользователь №: 25 593



Продолжим тему 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";

при этом все в порядке... А вот с программой на Си незнаю что делать... Подскажите плз...
Go to the top of the page
 
+Quote Post

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

 


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


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