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

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

 

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

 

Спасибо.

Изменено пользователем -=Vitaly=-

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


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

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

 

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

 

 

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

 

Спасибо.

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


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

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

*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.

Функция работает, но я ее в свое время украл с кокого то форума, могу поискать...

 

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

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


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

Спасибо.

 

Я хочу банально вручную выставлять 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=-

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


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

Вы пользуетесь 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)); 
}

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


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

Вы пользуетесь 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:

Вот как узнаю так все у меня заработает и с xspi_l.h и с xspi.h :)

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


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

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

 

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

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


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

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

 

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

 

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

 

Спасибо!

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


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

Я возможно перестал понимать суть вопроса... 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. Что происходит когда вы ранайете нечто подобное?

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


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

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

 

#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

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


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

Не, вы наверное единственный умный. Я с С работаю всего неделю,

 

С этого и надо было начинать :)

 

 

 

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

 

XSpi MY_Spi;



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

...

}

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


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

С этого и надо было начинать :)

 

 

 

У Вас направильно определен этот самый 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 *, или я чего-то не доганяю???

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


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

У Вас направильно определен этот самый 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);
         }
}
//---------------------------------------------------------------------------------------------

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


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

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

 

Вроде завелось таким макаром, но надо еще по-тестировать

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

 

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

 

Что касается совета CodeWarrior1241 использовать меньше глобальных переменных, то тут он прав, а что касается идеи передавать MySpi по ЗНАЧЕНИЮ в функцию InitSPI - то тут он не прав, такая передача во первых сожрет дополнительную память (на копию структуры параметра), а во вторых не позволит работать с ней за пределами InitSPI, так как вся инициализация этой структуры останется в локальной копии - параметре и не попадет в место вызова InitSPI. В данном случае нужно или передавать указатель, объявив экземпляр структуры в месте вызова InitSPI, либо сделать эту переменную локальной в самой функции InitSPI не передавая вообще ничего (но в таком случае ВСЯ работа с MySpi должна содержаться ВНУТРИ InitSPI)

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


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

Спасибо, но у меня при включении 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=-

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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