VitalyM4 0 17 мая, 2007 Опубликовано 17 мая, 2007 (изменено) · Жалоба Здравствуйте, где для Микроблейзового софта взять *InstancePtr для функции XSpi_SetSlaveSelect?? Спасибо. Изменено 17 мая, 2007 пользователем -=Vitaly=- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 17 мая, 2007 Опубликовано 17 мая, 2007 · Жалоба Здравствуйте, где для Микроблейзового софта взять *InstancePtr для функции XSpi_SetSlaveSelect?? А если быть более точным, то многие функции требуют *InstatncePtr, а вот где их взять не пойму?? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CodeWarrior1241 0 17 мая, 2007 Опубликовано 17 мая, 2007 · Жалоба Здравствуйте, где для Микроблейзового софта взять *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. Функция работает, но я ее в свое время украл с кокого то форума, могу поискать... Если полностю не понял вопроса, извините.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 17 мая, 2007 Опубликовано 17 мая, 2007 (изменено) · Жалоба Спасибо. Я хочу банально вручную выставлять 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); Где я лажанулся??? Изменено 17 мая, 2007 пользователем -=Vitaly=- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CodeWarrior1241 0 17 мая, 2007 Опубликовано 17 мая, 2007 · Жалоба Вы пользуетесь 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)); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 18 мая, 2007 Опубликовано 18 мая, 2007 · Жалоба Вы пользуетесь 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 :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CodeWarrior1241 0 18 мая, 2007 Опубликовано 18 мая, 2007 · Жалоба Так зделайте его глобальным и все! Веди это же ваш XDevice DeviceInstance. Там где делаете declaration of structure XDevice, там и делаете declaration of the pointer... Хотя я наверно не единственный умный, Вы наверно так уже пробовали. И не работало? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 18 мая, 2007 Опубликовано 18 мая, 2007 · Жалоба Так зделайте его глобальным и все! Веди это же ваш XDevice DeviceInstance. Там где делаете declaration of structure XDevice, там и делаете declaration of the pointer... Хотя я наверно не единственный умный, Вы наверно так уже пробовали. И не работало? Не, вы наверное единственный умный. Я с С работаю всего неделю, так что я :07: не совсем догоняю как это сделать. Если вас не затруднит строчечку :crying: чиркануть про declaration of the pointer... , то я был бы неимоверно :08: и вам большой :a14: Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CodeWarrior1241 0 18 мая, 2007 Опубликовано 18 мая, 2007 · Жалоба Я возможно перестал понимать суть вопроса... 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. Что происходит когда вы ранайете нечто подобное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 21 мая, 2007 Опубликовано 21 мая, 2007 · Жалоба Хе, хе бой продолжается. Перестало компилиться находит ошибку в проге, я просто :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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 21 мая, 2007 Опубликовано 21 мая, 2007 · Жалоба Не, вы наверное единственный умный. Я с С работаю всего неделю, С этого и надо было начинать :) У Вас направильно определен этот самый InstancePtr, надо делать так: XSpi MY_Spi; void InitSPI (void) { XSpi_Initialize(&MY_Spi,XPAR_OPB_SPI_0_DEVICE_ID); XSpi_Start(&MY_Spi); ... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 21 мая, 2007 Опубликовано 21 мая, 2007 · Жалоба С этого и надо было начинать :) У Вас направильно определен этот самый 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 0 21 мая, 2007 Опубликовано 21 мая, 2007 · Жалоба У Вас направильно определен этот самый 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 12 22 мая, 2007 Опубликовано 22 мая, 2007 · Жалоба Действительно Вроде завелось таким макаром, но надо еще по-тестировать Интересно, а почему тогда в документации везде не & a *, или я чего-то не доганяю??? Все просто, функции XSpi_* хотят УКАЗАТЕЛЬ на ЭКЗЕМПЛЯР структуры XSpi, если вы создаете только указатель (XSpi* InstancePtr), то функции получают указатель, указывающий неизвестно куда (точнее указывающий на 0 адрес), поэтому вы должны создать ЭКЗЕМПЛЯР структуры (XSpi My_SPI) и передать УКАЗАТЕЛЬ на него в функции работы с SPI. Оператор '&' берет адрес от переменной (того самого ЭКЗЕМПЛЯРА структуры), который как раз и является УКАЗАТЕЛЕМ, с которым хотят работать XSpi_* функции. Что касается совета CodeWarrior1241 использовать меньше глобальных переменных, то тут он прав, а что касается идеи передавать MySpi по ЗНАЧЕНИЮ в функцию InitSPI - то тут он не прав, такая передача во первых сожрет дополнительную память (на копию структуры параметра), а во вторых не позволит работать с ней за пределами InitSPI, так как вся инициализация этой структуры останется в локальной копии - параметре и не попадет в место вызова InitSPI. В данном случае нужно или передавать указатель, объявив экземпляр структуры в месте вызова InitSPI, либо сделать эту переменную локальной в самой функции InitSPI не передавая вообще ничего (но в таком случае ВСЯ работа с MySpi должна содержаться ВНУТРИ InitSPI) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 22 мая, 2007 Опубликовано 22 мая, 2007 (изменено) · Жалоба Спасибо, но у меня при включении 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 Не нравится код, который в хедере, как такое может быть? Ни у кого ничего подобного не было? Изменено 22 мая, 2007 пользователем -=Vitaly=- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться