Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Microblaze InstancePtr
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
-=Vitaly=-
Здравствуйте, где для Микроблейзового софта взять

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

Спасибо.
-=Vitaly=-
Здравствуйте, где для Микроблейзового софта взять

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


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

Спасибо.
CodeWarrior1241
Цитата(-=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.
Функция работает, но я ее в свое время украл с кокого то форума, могу поискать...

Если полностю не понял вопроса, извините....
-=Vitaly=-
Спасибо.

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


Где я лажанулся???
CodeWarrior1241
Вы пользуетесь 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));
}
-=Vitaly=-
Цитата(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
CodeWarrior1241
Так зделайте его глобальным и все! Веди это же ваш XDevice DeviceInstance. Там где делаете declaration of structure XDevice, там и делаете declaration of the pointer...

Хотя я наверно не единственный умный, Вы наверно так уже пробовали. И не работало?
-=Vitaly=-
Цитата(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

Спасибо!
CodeWarrior1241
Я возможно перестал понимать суть вопроса... 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. Что происходит когда вы ранайете нечто подобное?
-=Vitaly=-
Хе, хе бой продолжается. Перестало компилиться находит ошибку в проге, я просто 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
XVR
Цитата(-=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);  

...

}
-=Vitaly=-
Цитата(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 *, или я чего-то не доганяю???
CodeWarrior1241
Цитата
У Вас направильно определен этот самый 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);
         }
}
//---------------------------------------------------------------------------------------------
XVR
Цитата(-=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)
-=Vitaly=-
Спасибо, но у меня при включении 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


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

Согласен... Но предполагалось что пока -=Vitaly=- отлажевает код, работать с MySpi ему придется только внутри его отладочной функции. А потом он бы разобрался biggrin.gif .
2 -=Vitaly=-:
Пришлите Вашу xspi_i.h файл (?), моя приложена к этому post. Может diff сделайте с Вашим?
-=Vitaly=-
Пока сделал так, проверил работает, правда приходится SS вручную выставлять
Код
void InitSPI (void)
{

        XSpi_mSetControlReg(XPAR_OPB_SPI_0_BASEADDR, (XSP_CR_ENABLE_MASK | XSP_CR_MASTER_MODE_MASK | XSP_MANUAL_SSELECT_OPTION));
}

void SET_SLAVE_SSB_LOW (void)
{
     XGpio_mWriteReg (XPAR_LEDS_8BIT_BASEADDR,0x00,(SPI_SLAVE_NORMAL_MODE | SPI_SSB_LOW));
     //affects SPISSR (SPI Slave Relect Register on Default =1;
    // xil_printf("SPI_SSB set LOW \r\n");
}    

void SET_SLAVE_SSB_HIGH (void)
{
      XGpio_mWriteReg (XPAR_LEDS_8BIT_BASEADDR,0x00,(SPI_SLAVE_NORMAL_MODE | SPI_SSB_HIGH));  
     // xil_printf("SPI_SSB set HIGH \r\n");
}

void SPI_WRITE_DATA (char INTERNAL_ADRESS, char SEND_DATA)
{

   SET_SLAVE_SSB_LOW();
    XSpi_mSendByte(XPAR_OPB_SPI_0_BASEADDR,((INTERNAL_ADRESS<<1)|WRITE));
        while ( XSpi_mGetStatusReg(XPAR_OPB_SPI_0_BASEADDR)&XSP_SR_RX_EMPTY_MASK )
        { }
       XSpi_mRecvByte(XPAR_OPB_SPI_0_BASEADDR);
      //      }
    XSpi_mSendByte(XPAR_OPB_SPI_0_BASEADDR, SEND_DATA);
        while ( XSpi_mGetStatusReg(XPAR_OPB_SPI_0_BASEADDR)&XSP_SR_RX_EMPTY_MASK )
        { }
    XSpi_mRecvByte(XPAR_OPB_SPI_0_BASEADDR);
     //       }    
   SET_SLAVE_SSB_HIGH();          
}
CodeWarrior1241
2 -=Vitaly=-:
Я попробовал зделать EDK8.2 проект используя код который я привел выше. Все работало, и проблем с xspi_i.h небыло... Архив проекта не умещается здесь, поставил на http://slil.ru/24404862. Я вывел все на ISE, но этим не обязательно пользоватся, если Вы введете .ucf файл под Вашу плату в XPS все сработает и так.
-=Vitaly=-
Цитата(CodeWarrior1241 @ May 23 2007, 08:56) *
2 -=Vitaly=-:
Я попробовал зделать EDK8.2 проект используя код который я привел выше. Все работало, и проблем с xspi_i.h небыло... Архив проекта не умещается здесь, поставил на http://slil.ru/24404862. Я вывел все на ISE, но этим не обязательно пользоватся, если Вы введете .ucf файл под Вашу плату в XPS все сработает и так.

Спасибо, обязательно посмотрим. Я щас работаю под 9.1
Рановато наверное начал, говорили же люди до 3го сервиспака ни-ни!! 01.gif
-=Vitaly=-
Работает так как сказал CodeWarrior, но я не инклудил xspi_i.h и у меня он не молотит все время пачки, а затыкается через некоторе время.
Так что имеем теперь 2 метода работы с SPI - мой и правильный beer.gif
CodeWarrior1241
Цитата(-=Vitaly=- @ May 23 2007, 09:20) *
Работает так как сказал CodeWarrior, но я не инклудил xspi_i.h и у меня он не молотит все время пачки, а затыкается через некоторе время.
Так что имеем теперь 2 метода работы с SPI мой и правильный beer.gif

Нащет этoй header, на ней написано "for internal use only", поэтому наверно explicitly присоиденять её не надо... Вроде все что надо присоиденять находится в /microblaze_0/include.
Цитата
Рановато наверное начал, говорили же люди до 3го сервиспака ни-ни!! 01.gif

lol, мы сами еще на 9.1 flow не перешли, наш админ как раз по этим сооброжениям и действует.
-=Vitaly=-
Подскажите есть ли стандартная функция в EDK типа XIic_SelfTest, но которая выдавала бы на ножки данные. А то у меня осциллограф молчит, XIic_SelfTest выдает,что все ок.

Выводы IIC вывел на ножки плиса с внутренним пуллапом.

Код
void IIC_init(XIic MY_Iic)
{
Xuint32 Iic_status;
XIic_Initialize  (&MY_Iic, XPAR_OPB_IIC_0_DEVICE_ID);
XIic_SetOptions (&MY_Iic,XIIC_CR_ENABLE_DEVICE_MASK);
XIic_Start(&MY_Iic);
Iic_status= XIic_SelfTest(&MY_Iic);
    if(Iic_status== XST_SUCCESS){
        xil_printf("IIC selftest succesful \r\n");
      }
      else{      
       xil_printf("IIC some errors detected \r\n");
        }

}

void main(void)
{      
       while(1)
          {
                  XIic_MasterSend  (&MY_Iic,0x55,1);  
          }
            
}


И еще вопросик к CodeWarrior
почему в функцию
Код

#define SLAVE_STARTING_ADDRESS        0x00    // set the starting slave address    
XSpi_Initialize(&MY_Spi, SLAVE_STARTING_ADDRESS);

вы передаете адрес, когда по документации там должен идти DeviceId. Конечно в нашем случае они оба равны 0, но хотелось бы прояснить ситуацию.

И еще мне не совсем понятно почему маски в xspi_l.h и xspi.h указывающие на один и тот же бит (например в регистре статуса) имеют разные значения в 2х хедерах. С I2C то же самое. В чем секрет?
CodeWarrior1241
Цитата
почему в функцию
Код
#define SLAVE_STARTING_ADDRESS        0x00    // set the starting slave address    
XSpi_Initialize(&MY_Spi, SLAVE_STARTING_ADDRESS);

вы передаете адрес, когда по документации там должен идти DeviceId. Конечно в нашем случае они оба равны 0, но хотелось бы прояснить ситуацию.

Чесно говоря, я и имел DeviceID в виду, возможно это не самый лучший выбор для названия константов. Наверно так получилось из за cut and paste biggrin.gif . Если это был бы реальный проект, скорее всего где нубудь в header-е я бы имел таблицу возможных slaves, их названия и соответствущию нумерацию.
Цитата
И еще мне не совсем понятно почему маски в xspi_l.h и xspi.h указывающие на один и тот же бит (например в регистре статуса) имеют разные значения в 2х хедерах. С I2C то же самое. В чем секрет?

Umm... Не врубаюсь. Может я че то не понял, но в xspi.h нету bitewise definitions... Вроде в этом весь смысл, xspi.h должна Вас изолировать от такой информации. Приведите пример от обеих файлов плз.

Нащет I2C, вроде все правельно... Не помню точно все расстановки, может что-то не выставлено, но architecture - ОК. Сравню с работущим, выставлю сюда. Единственное - помойму я всегда пользовался external pull-up, а не внутринними. Но это не должно играть роль... В UCF у Вас все правельно обозначено????
-=Vitaly=-
Цитата(CodeWarrior1241 @ May 24 2007, 15:40) *
Чесно говоря, я и имел DeviceID в виду, возможно это не самый лучший выбор для названия константов. Наверно так получилось из за cut and paste biggrin.gif . Если это был бы реальный проект, скорее всего где нубудь в header-е я бы имел таблицу возможных slaves, их названия и соответствущию нумерацию.

Umm... Не врубаюсь. Может я че то не понял, но в xspi.h нету bitewise definitions... Вроде в этом весь смысл, xspi.h должна Вас изолировать от такой информации. Приведите пример от обеих файлов плз.

Нащет I2C, вроде все правельно... Не помню точно все расстановки, может что-то не выставлено, но architecture - ОК. Сравню с работущим, выставлю сюда. Единственное - помойму я всегда пользовался external pull-up, а не внутринними. Но это не должно играть роль... В UCF у Вас все правельно обозначено????

Да в юсф все нормально.

Смотрите:

Код
xspi.h

[b]#define XSP_MASTER_OPTION           0x1
#define XSP_CLK_ACTIVE_LOW_OPTION   0x2[/b]
#define XSP_CLK_PHASE_1_OPTION      0x4
#define XSP_LOOPBACK_OPTION         0x8
#define XSP_MANUAL_SSELECT_OPTION   0x10


XSpi_SetOptions(&MY_Spi,(XSP_MASTER_OPTION | XSP_MANUAL_SSELECT_OPTION));


xspi_l.h

#define XSP_CR_LOOPBACK_MASK        0x1   /* Local loopback mode */
#define XSP_CR_ENABLE_MASK          0x2   /* System enable */
[b]#define XSP_CR_MASTER_MODE_MASK     0x4   /* Enable master mode */[/b]
[b]#define XSP_CR_CLK_POLARITY_MASK    0x8   /* Clock polarity high or low */[/b]
#define XSP_CR_CLK_PHASE_MASK      0x10   /* Clock phase 0 or 1 */
#define XSP_CR_TXFIFO_RESET_MASK   0x20   /* Reset transmit FIFO */
#define XSP_CR_RXFIFO_RESET_MASK   0x40   /* Reset receive FIFO */
#define XSP_CR_MANUAL_SS_MASK      0x80   /* Manual slave select assertion */
#define XSP_CR_TRANS_INHIBIT_MASK  0x100  /* Master transaction inhibit */



XSpi_mSetControlReg(XPAR_OPB_SPI_0_BASEADDR, (XSP_CR_ENABLE_MASK | XSP_CR_MASTER_MODE_MASK));


Вот пример дефайнов из соответсвующих файлов и получается что для XSpi_SetOptions я ОБЯЗАТЕЛЬНО
должен брать дефайны из xspi.h, a для XSpi_mSetControlReg из xspi_l.h. На что я пару раз а напоролся
smile3046.gif Почему нельзя было сделать дефайны общими??
CodeWarrior1241
Цитата(-=Vitaly=- @ May 24 2007, 05:52) *
Подскажите есть ли стандартная функция в EDK типа XIic_SelfTest, но которая выдавала бы на ножки данные. А то у меня осциллограф молчит, XIic_SelfTest выдает,что все ок.

Выводы IIC вывел на ножки плиса с внутренним пуллапом.

У меня не задействован I2C self-test. Я заметил пару, в моем понимании, ошибок:
1. В XIic_SetOptions (&MY_Iic,XIIC_CR_ENABLE_DEVICE_MASK); строке, функция из xiic.h, но definition XIIC_CR_ENABLE_DEVICE_MASK из xiic_l.h. Они не совместимы, options от одной не будут работать как argument для другой.
2. Вы не устанавливаете адрес slave к которому Вы высылаете 0х55. Как же I2C будет без этого?
Я выставляю адрес slave-a каждый раз когда что либо пересылаю, естессно. Посмотрите комменты к функции XIic_SetAddress of the xiic.c file. Там написано почему имея XI2C_ADDRESS_TO_SEND = 0х01, надо иметь AddressType тоже. Это сваязано с установлением причины изминения адреса, т.е. если XIic_SetAddress вызывается опять, AddressType будет обозночать или то что Microblaze стал теперь slave, или что он продолжает быть master. Еще в xiic.h это поясняется:
Код
/* The following address types are used when setting and getting the addresses
* of the driver. These are mutually exclusive such that only one or the other
* may be specified.
*/
/** bus address of slave device */
#define XII_ADDR_TO_SEND_TYPE       1
/** this device's bus address when slave */
#define XII_ADDR_TO_RESPOND_TYPE    2

Собственно, вот сам код, попробуйте...
Код
#include "xparameters.h"
#include "xiic.h"
#include "xiic_l.h"
#include "xbasic_types.h"
#include "xstatus.h"      

#define XI2C_ADDRESS_TO_SEND        0x01

void IIC_init(XIic MY_Iic)
{
Xuint32 Iic_status;
XIic_Initialize  (&MY_Iic, XPAR_OPB_IIC_0_DEVICE_ID);
//XIic_SetOptions (&MY_Iic,XIIC_CR_ENABLE_DEVICE_MASK);
XIic_Start(&MY_Iic);
/*
Iic_status= XIic_SelfTest(&MY_Iic);
    if(Iic_status== XST_SUCCESS){
        xil_printf("IIC selftest succesful \r\n");
      }
      else{      
       xil_printf("IIC some errors detected \r\n");
        }
*/
}

void main(void)
{      
       while(1)
          {
            XIic_SetAddress(&MY_Iic, XII_ADDR_TO_SEND_TYPE, XI2C_ADDRESS_TO_SEND);        
            XIic_MasterSend (&MY_Iic,0x55,1);  
          }
            
}
-=Vitaly=-
Ау
CodeWarrior1241
Цитата(-=Vitaly=- @ Jun 7 2007, 07:33) *
Ау

Так получилось I2C с Microblaze гнать?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.