skopus 0 15 января, 2007 Опубликовано 15 января, 2007 · Жалоба Господа, а существует ли какая-нибудь библиотека, подключаемая в VisualDSP++ 3.5 для обмена данными по SPI на языке Си. Или необходимо вручную на ассемблере организовывать обмен сообщениями? пока хочется написать простой тест типа : принять команду по USB (FT2232), затем получить ее по SPI дспшником и отправить сообщение обратно. Был бы очень признателен, если бы вы показали мне пример на Си, или подсказали место, где его взять. PS : с сайта analog.com Скачал апнот "Interfacing the ADSP-2191 to an AD7476 via SPI port", однако понимается с трудом :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Игореша 0 15 января, 2007 Опубликовано 15 января, 2007 · Жалоба Есть в VisualDSP++ 4.5. Есть драйверы для всякой периферии, в т.ч. и для SPI Еще там есть много example-ов, так что проблем с пониманием не возникнет Есть в VisualDSP++ 4.5. Есть драйверы для всякой периферии, в т.ч. и для SPI Еще там есть много example-ов, так что проблем с пониманием не возникнет Прошу прощения, не обратил внимания на тип процессора. То что я написал справедливо для BlackFina, а не для 2191 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skopus 0 16 января, 2007 Опубликовано 16 января, 2007 · Жалоба Есть в VisualDSP++ 4.5. Есть драйверы для всякой периферии, в т.ч. и для SPI Еще там есть много example-ов, так что проблем с пониманием не возникнет Есть в VisualDSP++ 4.5. Есть драйверы для всякой периферии, в т.ч. и для SPI Еще там есть много example-ов, так что проблем с пониманием не возникнет Прошу прощения, не обратил внимания на тип процессора. То что я написал справедливо для BlackFina, а не для 2191 угу, к сожалению, у меня в проекте не BlackFin :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
K A A 0 16 января, 2007 Опубликовано 16 января, 2007 · Жалоба Дык, вроде бы там ничего особенного. Настраиваешь SPI-порт и работаешь с ним. Все регистры описаны, и вроде, даже по-русски. С FT2232, может, придется больше повозиться. Но там есть примеры для работы по SPI через интерфейс D2XX. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость mihask 16 января, 2007 Опубликовано 16 января, 2007 · Жалоба Вот - но правда на асме. :) ______________________ При переходе на СИ для переключения страниц и записи/чтения регистров используются вот эти функции (описание в мануале на компилятор) 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skopus 0 16 января, 2007 Опубликовано 16 января, 2007 · Жалоба Ну с 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 все же или самому писать класс :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skopus 0 16 января, 2007 Опубликовано 16 января, 2007 · Жалоба Вот - но правда на асме. :) ______________________ спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bureau 0 2 ноября, 2007 Опубликовано 2 ноября, 2007 · Жалоба Продолжим тему 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"; при этом все в порядке... А вот с программой на Си незнаю что делать... Подскажите плз... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться