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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Microblaze InstancePtr
-=Vitaly=-
сообщение May 17 2007, 03:59
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991



Здравствуйте, где для Микроблейзового софта взять

*InstancePtr для функции XSpi_SetSlaveSelect??

Спасибо.

Сообщение отредактировал -=Vitaly=- - May 17 2007, 04:13
Go to the top of the page
 
+Quote Post
-=Vitaly=-
сообщение May 17 2007, 11:18
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991



Здравствуйте, где для Микроблейзового софта взять

*InstancePtr для функции XSpi_SetSlaveSelect??


А если быть более точным, то многие функции требуют *InstatncePtr, а вот где их взять не пойму??

Спасибо.
Go to the top of the page
 
+Quote Post
CodeWarrior1241
сообщение May 17 2007, 12:22
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 496
Регистрация: 14-03-07
Из: In The District
Пользователь №: 26 165



Цитата(-=Vitaly=- @ May 17 2007, 07:18) *
Здравствуйте, где для Микроблейзового софта взять
*InstancePtr для функции XSpi_SetSlaveSelect??
А если быть более точным, то многие функции требуют *InstatncePtr, а вот где их взять не пойму??
Спасибо.

Я может не понял вопроса, но у меня например есть функция
Код
XSpi_SetSlaveSelect(XSpi * InstancePtr, u32 SlaveMask)
, так там я делаю pointer initialization,
a потом пользуюсь им что бы host не мог изменять slave select в время transfer.
Код
XASSERT_NONVOID(InstancePtr != NULL);
XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);
if (InstancePtr->IsBusy) {
   return XST_DEVICE_BUSY;
}

Дальше делаю все остальное, проверю SlaveMask, смотрю что бы один только slave вызван, etc.
Функция работает, но я ее в свое время украл с кокого то форума, могу поискать...

Если полностю не понял вопроса, извините....


--------------------
In Mozilla, you keep tabs on your browser. In the USSR, your browser keeps tabs on you.
Go to the top of the page
 
+Quote Post
-=Vitaly=-
сообщение May 17 2007, 12:41
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991



Спасибо.

Я хочу банально вручную выставлять SS сигнал на SPI, у меня 1 SPI сконфигурированный как мастер.

Читаю xilinx driver user guide:

Component Instance

An instance of a component is created when a variable is created using the component data type. An
instance of a component maps to each physical hardware device. Each instance may have unique
characteristics such as it’s memory mapped address and specific device capabilities.

Component Example

The following code example illustrates a device driver component.
Код
/* the device component data type */

typedef struct
{
Xuint32 BaseAddress; /* component data variables */
Xuint32 IsReady;
Xuint32 IsStarted;
} XDevice;

/* create an instance of a device */

XDevice DeviceInstance;

/* device component interfaces */
XStatus XDevice_Initialize(XDevice *InstancePtr, Xuint16 DeviceId);
XStatus XDevice_Start(XDevice *InstancePtr);


Делаю.

В переменных:
Код
XSpi *MY_Spi;


Объявляю функцию инициализации, XPAR_OPB_SPI_0_DEVICE_ID взято из файла xparameters.h и равно 0 т.к SPI один
Код
//Initial SPI function
void InitSPI (void)
{
    XSpi_Initialize(MY_Spi,XPAR_OPB_SPI_0_DEVICE_ID);
    XSpi_Start(MY_Spi);  
    XSpi_mSetControlReg(XPAR_OPB_SPI_0_BASEADDR, (XSP_CR_ENABLE_MASK | XSP_CR_MASTER_MODE_MASK | XSP_CR_MANUAL_SS_MASK));
    // Enable SPI in MASTER_MODE with MANUAL slave selection;
  
}

Все компилится без траблов, когда в программе вызываю
Код
  XSpi_SetSlaveSelect(MY_Spi,0x00000000);

то оно пишет
Код
XASSERT_NONVOID(InstancePtr != XNULL);


Где я лажанулся???

Сообщение отредактировал -=Vitaly=- - May 17 2007, 12:43
Go to the top of the page
 
+Quote Post
CodeWarrior1241
сообщение May 17 2007, 16:13
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 496
Регистрация: 14-03-07
Из: In The District
Пользователь №: 26 165



Вы пользуетесь low-level function XSpi_mSetControlReg из xspi_l.h, я так никогда не делал. Я пользуюсь только функциями из xspi.h, для SPI Configuration использую XSpi_SetOptions() функцию. Может Вы попробуйте:
Код
//Initial SPI function - assume global MY_Spi
void InitSPI (Xspi *MY_Spi)
{
    Xuint32 status; //SPI readback variable

    XSpi_Initialize(MY_Spi,XPAR_OPB_SPI_0_DEVICE_ID);
    XSpi_Start(MY_Spi);  
    //XSpi_mSetControlReg(XPAR_OPB_SPI_0_BASEADDR, (XSP_CR_ENABLE_MASK |        
        //XSP_CR_MASTER_MODE_MASK | XSP_CR_MANUAL_SS_MASK));
    // Run a self-test using the RS-232 debug port, omit if no RS-232 debug port in the system
    status = XSpi_SelfTest(MY_Spi);
    if (status == XST_SUCCESS) {
        xil_printf("SPI selftest successful\r\n");
    }
    if (status == XST_REGISTER_ERROR) {
        xil_printf("SPI register did not read or write correctly\r\n");
    }
    if (status == XST_LOOPBACK_ERROR) {
        xil_printf("SPI loopback error has occurred\r\n");
    }
    // Enable SPI in MASTER_MODE with MANUAL slave selection;
    XSpi_SetOptions(MY_Spi, (XSP_MASTER_OPTION | XSP_MANUAL_SSELECT_OPTION));
}


--------------------
In Mozilla, you keep tabs on your browser. In the USSR, your browser keeps tabs on you.
Go to the top of the page
 
+Quote Post
-=Vitaly=-
сообщение May 18 2007, 05:43
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991



Цитата(CodeWarrior1241 @ May 17 2007, 19:13) *
Вы пользуетесь low-level function XSpi_mSetControlReg из xspi_l.h, я так никогда не делал. Я пользуюсь только функциями из xspi.h, для SPI Configuration использую XSpi_SetOptions() функцию. Может Вы попробуйте:
Код
//Initial SPI function - assume global MY_Spi


Спасибо огромное, но у меня как раз проблема с этим самым global MY_Spi я блин не знаю где его прописать. 07.gif
Вот как узнаю так все у меня заработает и с xspi_l.h и с xspi.h smile.gif
Go to the top of the page
 
+Quote Post
CodeWarrior1241
сообщение May 18 2007, 09:00
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 496
Регистрация: 14-03-07
Из: In The District
Пользователь №: 26 165



Так зделайте его глобальным и все! Веди это же ваш XDevice DeviceInstance. Там где делаете declaration of structure XDevice, там и делаете declaration of the pointer...

Хотя я наверно не единственный умный, Вы наверно так уже пробовали. И не работало?


--------------------
In Mozilla, you keep tabs on your browser. In the USSR, your browser keeps tabs on you.
Go to the top of the page
 
+Quote Post
-=Vitaly=-
сообщение May 18 2007, 09:34
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991



Цитата(CodeWarrior1241 @ May 18 2007, 12:00) *
Так зделайте его глобальным и все! Веди это же ваш XDevice DeviceInstance. Там где делаете declaration of structure XDevice, там и делаете declaration of the pointer...

Хотя я наверно не единственный умный, Вы наверно так уже пробовали. И не работало?


Не, вы наверное единственный умный. Я с С работаю всего неделю, так что я 07.gif не совсем догоняю как это сделать. Если вас не затруднит строчечку crying.gif чиркануть про declaration of the pointer... , то я был бы неимоверно 08.gif и вам большой a14.gif

Спасибо!
Go to the top of the page
 
+Quote Post
CodeWarrior1241
сообщение May 18 2007, 11:38
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 496
Регистрация: 14-03-07
Из: In The District
Пользователь №: 26 165



Я возможно перестал понимать суть вопроса... pointer declaration - Вы же сами написали как Вы это делаете -
Код
XSpi *MY_Spi;
. Зделайте declaration в вашей
Код
main {}
функции, и все! Может че то не улавливаю, но у меня именно так. Если хотите, бросте сюда Ваш код, может я не понял суть. Ведь в вашей .с файле вы привазываете xspi.h и xspi_l.h #include-ом? Там как раз и есть declaration of the Xspi structure. И у Вас есть linker который связывает ваши .с source files вместе, для этого Вы пользуетесь XPS. Ваш код будет выглядеть похожим на этот:
/
Код
* This is my file for testing the OPB SPI core */
// Include the needed SPI files
#include xspi.h
#include xspi_i.h
#include xspi_l.h
// Include the other mandatory Microblaze header files here
...
// Function prototypes are here
void InitSPI (Xspi *MY_Spi);
...
// Begin Main
void main(void)
{
    Xspi *MY_Spi;            // declare nothing else, its all in the xspi.h and xspi.c files
    while(TRUE) {
        InitSPI(MY_Spi);     // run your SPI function in an infinite loop
    }
}
/* Define the InitSPI function as in post
   http://electronix.ru/forum/index.php?s=&showtopic=31692&view=findpost&p=251550
*/
void InitSPI (Xspi *MY_Spi)
{
    ...
}

Не забывайте что pointer MY_Spi должен быть passed into the InitSPI function. Что происходит когда вы ранайете нечто подобное?


--------------------
In Mozilla, you keep tabs on your browser. In the USSR, your browser keeps tabs on you.
Go to the top of the page
 
+Quote Post
-=Vitaly=-
сообщение May 21 2007, 07:54
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991



Хе, хе бой продолжается. Перестало компилиться находит ошибку в проге, я просто smile3046.gif

Код
#include "xparameters.h"
#include "xspi_l.h"
#include "xspi_i.h"
#include "xspi.h"
//------------------------- Variable declarations-----------------------------------
Xuint32 SPI_REG_STATUS;
//-------------------------Function prototypes------------------------------------
void InitSPI (XSpi *MY_Spi);

//Initial SPI function
void InitSPI (XSpi *MY_Spi)
{

    Xuint32 status;
    XSpi_Initialize(MY_Spi,XPAR_OPB_SPI_0_DEVICE_ID);
    XSpi_Start(MY_Spi);  
    status= XSpi_SelfTest(MY_Spi);
    if(status== XST_SUCCESS){
        xil_printf("Spi selftest succesful /r/n");
      }
    if(status ==XST_REGISTER_ERROR)    {
        xil_printf("SPI register didn't read or write correctly");
    }
    if(status==XST_LOOPBACK_ERROR){
        xil_printf("SPI loopback error has occured");
  }

  XSpi_SetOptions(MY_Spi,(XSP_CR_MASTER_MODE_MASK | XSP_CR_MANUAL_SS_MASK));
}
Xuint32 k,tmp_data;
//--------------------------------------Main Function-----------------------------------------
void main(void)
{  
        XSpi *MY_Spi;
           while(TRUE)
         {
          InitSPI(MY_Spi);
         }
}
//---------------------------------------------------------------------------------------------


Еггорки

Код
*** Incremental build of configuration Debug for project spi_mb ****

make all
mb-gcc -c -mno-xl-soft-mul -mxl-pattern-compare -mcpu=v6.00.b -I../../microblaze_0_sw_platform/microblaze_0/include -xl-mode-executable -g -O0 -omain.o ../main.c
In file included from ../main.c:9:
../../microblaze_0_sw_platform/microblaze_0/include/xspi_i.h:124: error: parse error before '*' token
../../microblaze_0_sw_platform/microblaze_0/include/xspi_i.h:128: error: parse error before "XSpi_ConfigTable"
../../microblaze_0_sw_platform/microblaze_0/include/xspi_i.h:128: warning: data definition has no type or storage class
../main.c: In function `main':
../main.c:39: warning: return type of 'main' is not `int'
../main.c: At top level:
../../microblaze_0_sw_platform/microblaze_0/include/xspi_i.h:128: warning: array 'XSpi_ConfigTable' assumed to have one element
make: *** [main.o] Error 1
Build complete for project spi_mb
Go to the top of the page
 
+Quote Post
XVR
сообщение May 21 2007, 09:22
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(-=Vitaly=- @ May 18 2007, 13:34) *
Не, вы наверное единственный умный. Я с С работаю всего неделю,


С этого и надо было начинать smile.gif



У Вас направильно определен этот самый InstancePtr, надо делать так:

Код
XSpi MY_Spi;



void InitSPI (void)
{
    XSpi_Initialize(&MY_Spi,XPAR_OPB_SPI_0_DEVICE_ID);
    XSpi_Start(&MY_Spi);  

...

}
Go to the top of the page
 
+Quote Post
-=Vitaly=-
сообщение May 21 2007, 12:57
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991



Цитата(XVR @ May 21 2007, 12:22) *
С этого и надо было начинать smile.gif



У Вас направильно определен этот самый InstancePtr, надо делать так:

Код
XSpi MY_Spi;



void InitSPI (void)
{
    XSpi_Initialize(&MY_Spi,XPAR_OPB_SPI_0_DEVICE_ID);
    XSpi_Start(&MY_Spi);  

...

}

Действительно

Код
// Welcome to Xilinx Platform Studio SDK !
//
// This is an automatically created source file to help you get started.
// To add more files, navigate to File -> New -> File
// You may delete this file if you want to use only other files for your project.
//
#include "xparameters.h"
#include "xspi_l.h"
//#include "xspi_i.h"
#include "xspi.h"
#include "stdio.h"
//------------------------- Variable declarations-----------------------------------
Xuint32 SPI_REG_STATUS;
XSpi MY_Spi;
//-------------------------Function prototypes------------------------------------
void InitSPI (void);

//Initial SPI function
void InitSPI (void)
{

    Xuint32 status;
    XSpi_Initialize(&MY_Spi,XPAR_OPB_SPI_0_DEVICE_ID);
    XSpi_Start(&MY_Spi);  
    status= XSpi_SelfTest(&MY_Spi);
    if(status== XST_SUCCESS){
        xil_printf("Spi selftest succesful /r/n");
      }
    if(status ==XST_REGISTER_ERROR)    {
        xil_printf("SPI register didn't read or write correctly");
    }
    if(status==XST_LOOPBACK_ERROR){
        xil_printf("SPI loopback error has occured");
  }

  XSpi_SetOptions(&MY_Spi,(XSP_CR_MASTER_MODE_MASK | XSP_CR_MANUAL_SS_MASK));
}
Xuint32 k,tmp_data;
//--------------------------------------Main Function-----------------------------------------
void main(void)
{  
      
           while(TRUE)
         {
          InitSPI();
          xil_printf("SUCCESS");
         }
}
//---------------------------------------------------------------------------------------------

Вроде завелось таким макаром, но надо еще по-тестировать
Интересно, а почему тогда в документации везде не & a *, или я чего-то не доганяю???
Go to the top of the page
 
+Quote Post
CodeWarrior1241
сообщение May 21 2007, 12:59
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 496
Регистрация: 14-03-07
Из: In The District
Пользователь №: 26 165



Цитата
У Вас направильно определен этот самый InstancePtr, надо делать так:
Код
XSpi MY_Spi;

Это будет работать только если XSpi MY_Spi обявлен глобально. Если его обявить в main, это работать не будет! Я стараюсь иметь как можно меньше глобальных перемменых. My bad, пропустил &... Попробуйте как ниже...

Код
#include "xparameters.h"
#include "xspi_l.h"
#include "xspi_i.h"
#include "xspi.h"
//------------------------- Variable declarations-----------------------------------
Xuint32 SPI_REG_STATUS;
//-------------------------Function prototypes------------------------------------
void InitSPI (XSpi MY_Spi);

//Initial SPI function
void InitSPI (XSpi MY_Spi)
{

    Xuint32 status;
    XSpi_Initialize(&MY_Spi,XPAR_OPB_SPI_0_DEVICE_ID);
    XSpi_Start(&MY_Spi);  
    status= XSpi_SelfTest(&MY_Spi);
    if(status== XST_SUCCESS){
        xil_printf("Spi selftest succesful /r/n");
      }
    if(status ==XST_REGISTER_ERROR)    {
        xil_printf("SPI register didn't read or write correctly");
    }
    if(status==XST_LOOPBACK_ERROR){
        xil_printf("SPI loopback error has occured");
  }

  XSpi_SetOptions(&MY_Spi,(XSP_CR_MASTER_MODE_MASK | XSP_CR_MANUAL_SS_MASK));
}
//--------------------------------------Main Function-----------------------------------------
void main(void)
{  
        XSpi MY_Spi;
           while(TRUE)
         {
          InitSPI(MY_Spi);
         }
}
//---------------------------------------------------------------------------------------------


--------------------
In Mozilla, you keep tabs on your browser. In the USSR, your browser keeps tabs on you.
Go to the top of the page
 
+Quote Post
XVR
сообщение May 22 2007, 07:30
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(-=Vitaly=- @ May 21 2007, 16:57) *
Действительно

Вроде завелось таким макаром, но надо еще по-тестировать
Интересно, а почему тогда в документации везде не & a *, или я чего-то не доганяю???


Все просто, функции XSpi_* хотят УКАЗАТЕЛЬ на ЭКЗЕМПЛЯР структуры XSpi, если вы создаете только указатель (XSpi* InstancePtr), то функции получают указатель, указывающий неизвестно куда (точнее указывающий на 0 адрес), поэтому вы должны создать ЭКЗЕМПЛЯР структуры (XSpi My_SPI) и передать УКАЗАТЕЛЬ на него в функции работы с SPI. Оператор '&' берет адрес от переменной (того самого ЭКЗЕМПЛЯРА структуры), который как раз и является УКАЗАТЕЛЕМ, с которым хотят работать XSpi_* функции.

Что касается совета CodeWarrior1241 использовать меньше глобальных переменных, то тут он прав, а что касается идеи передавать MySpi по ЗНАЧЕНИЮ в функцию InitSPI - то тут он не прав, такая передача во первых сожрет дополнительную память (на копию структуры параметра), а во вторых не позволит работать с ней за пределами InitSPI, так как вся инициализация этой структуры останется в локальной копии - параметре и не попадет в место вызова InitSPI. В данном случае нужно или передавать указатель, объявив экземпляр структуры в месте вызова InitSPI, либо сделать эту переменную локальной в самой функции InitSPI не передавая вообще ничего (но в таком случае ВСЯ работа с MySpi должна содержаться ВНУТРИ InitSPI)
Go to the top of the page
 
+Quote Post
-=Vitaly=-
сообщение May 22 2007, 11:21
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991



Спасибо, но у меня при включении xspi_i.h отказывается компилироваться, т.е так как сказал CodeWarrior я проверить не могу. Вырубаешь его, все компилится, но в железе не работает, я подрубил ножки осциллографа на сигналы SPI, там тишина.

Вот код ошибки:

Код
*** Incremental build of configuration Debug for project spi_mb ****

make all
mb-gcc -c -mno-xl-soft-mul -mxl-pattern-compare -mcpu=v6.00.b -I../../microblaze_0_sw_platform/microblaze_0/include -xl-mode-executable -g -O0 -omain.o ../main.c
In file included from ../main.c:9:
../../microblaze_0_sw_platform/microblaze_0/include/xspi_i.h:124: error: parse error before '*' token
../../microblaze_0_sw_platform/microblaze_0/include/xspi_i.h:128: error: parse error before "XSpi_ConfigTable"
../../microblaze_0_sw_platform/microblaze_0/include/xspi_i.h:128: warning: data definition has no type or storage class
../main.c: In function `main':
../main.c:39: warning: return type of 'main' is not `int'
../main.c: At top level:
../../microblaze_0_sw_platform/microblaze_0/include/xspi_i.h:128: warning: array 'XSpi_ConfigTable' assumed to have one element
make: *** [main.o] Error 1
Build complete for project spi_mb


Не нравится код, который в хедере, как такое может быть?
Ни у кого ничего подобного не было?

Сообщение отредактировал -=Vitaly=- - May 22 2007, 11:22
Go to the top of the page
 
+Quote Post

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

 


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


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