CodeWarrior1241 0 22 мая, 2007 Опубликовано 22 мая, 2007 · Жалоба Что касается идеи передавать MySpi по ЗНАЧЕНИЮ в функцию InitSPI, такая передача во первых сожрет дополнительную память (на копию структуры параметра), а во вторых не позволит работать с ней за пределами InitSPI, так как вся инициализация этой структуры останется в локальной копии - параметре и не попадет в место вызова InitSPI. В данном случае нужно или передавать указатель, объявив экземпляр структуры в месте вызова InitSPI, либо сделать эту переменную локальной в самой функции InitSPI не передавая вообще ничего (но в таком случае ВСЯ работа с MySpi должна содержаться ВНУТРИ InitSPI) Согласен... Но предполагалось что пока -=Vitaly=- отлажевает код, работать с MySpi ему придется только внутри его отладочной функции. А потом он бы разобрался . 2 -=Vitaly=-: Пришлите Вашу xspi_i.h файл (?), моя приложена к этому post. Может diff сделайте с Вашим? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 22 мая, 2007 Опубликовано 22 мая, 2007 · Жалоба Пока сделал так, проверил работает, правда приходится 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 0 23 мая, 2007 Опубликовано 23 мая, 2007 · Жалоба 2 -=Vitaly=-: Я попробовал зделать EDK8.2 проект используя код который я привел выше. Все работало, и проблем с xspi_i.h небыло... Архив проекта не умещается здесь, поставил на http://slil.ru/24404862. Я вывел все на ISE, но этим не обязательно пользоватся, если Вы введете .ucf файл под Вашу плату в XPS все сработает и так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 23 мая, 2007 Опубликовано 23 мая, 2007 · Жалоба 2 -=Vitaly=-: Я попробовал зделать EDK8.2 проект используя код который я привел выше. Все работало, и проблем с xspi_i.h небыло... Архив проекта не умещается здесь, поставил на http://slil.ru/24404862. Я вывел все на ISE, но этим не обязательно пользоватся, если Вы введете .ucf файл под Вашу плату в XPS все сработает и так. Спасибо, обязательно посмотрим. Я щас работаю под 9.1 Рановато наверное начал, говорили же люди до 3го сервиспака ни-ни!! :01: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 23 мая, 2007 Опубликовано 23 мая, 2007 (изменено) · Жалоба Работает так как сказал CodeWarrior, но я не инклудил xspi_i.h и у меня он не молотит все время пачки, а затыкается через некоторе время. Так что имеем теперь 2 метода работы с SPI - мой и правильный :beer: Изменено 23 мая, 2007 пользователем -=Vitaly=- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CodeWarrior1241 0 23 мая, 2007 Опубликовано 23 мая, 2007 · Жалоба Работает так как сказал CodeWarrior, но я не инклудил xspi_i.h и у меня он не молотит все время пачки, а затыкается через некоторе время. Так что имеем теперь 2 метода работы с SPI мой и правильный :beer: Нащет этoй header, на ней написано "for internal use only", поэтому наверно explicitly присоиденять её не надо... Вроде все что надо присоиденять находится в /microblaze_0/include. Рановато наверное начал, говорили же люди до 3го сервиспака ни-ни!! :01: lol, мы сами еще на 9.1 flow не перешли, наш админ как раз по этим сооброжениям и действует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 24 мая, 2007 Опубликовано 24 мая, 2007 (изменено) · Жалоба Подскажите есть ли стандартная функция в 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 то же самое. В чем секрет? Изменено 24 мая, 2007 пользователем -=Vitaly=- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CodeWarrior1241 0 24 мая, 2007 Опубликовано 24 мая, 2007 · Жалоба почему в функцию #define SLAVE_STARTING_ADDRESS 0x00 // set the starting slave address XSpi_Initialize(&MY_Spi, SLAVE_STARTING_ADDRESS); вы передаете адрес, когда по документации там должен идти DeviceId. Конечно в нашем случае они оба равны 0, но хотелось бы прояснить ситуацию. Чесно говоря, я и имел DeviceID в виду, возможно это не самый лучший выбор для названия константов. Наверно так получилось из за cut and paste . Если это был бы реальный проект, скорее всего где нубудь в header-е я бы имел таблицу возможных slaves, их названия и соответствущию нумерацию. И еще мне не совсем понятно почему маски в xspi_l.h и xspi.h указывающие на один и тот же бит (например в регистре статуса) имеют разные значения в 2х хедерах. С I2C то же самое. В чем секрет? Umm... Не врубаюсь. Может я че то не понял, но в xspi.h нету bitewise definitions... Вроде в этом весь смысл, xspi.h должна Вас изолировать от такой информации. Приведите пример от обеих файлов плз. Нащет I2C, вроде все правельно... Не помню точно все расстановки, может что-то не выставлено, но architecture - ОК. Сравню с работущим, выставлю сюда. Единственное - помойму я всегда пользовался external pull-up, а не внутринними. Но это не должно играть роль... В UCF у Вас все правельно обозначено???? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 24 мая, 2007 Опубликовано 24 мая, 2007 (изменено) · Жалоба Чесно говоря, я и имел DeviceID в виду, возможно это не самый лучший выбор для названия константов. Наверно так получилось из за cut and paste . Если это был бы реальный проект, скорее всего где нубудь в 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: Почему нельзя было сделать дефайны общими?? Изменено 24 мая, 2007 пользователем -=Vitaly=- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CodeWarrior1241 0 25 мая, 2007 Опубликовано 25 мая, 2007 · Жалоба Подскажите есть ли стандартная функция в 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); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 7 июня, 2007 Опубликовано 7 июня, 2007 (изменено) · Жалоба Ау Изменено 7 июня, 2007 пользователем -=Vitaly=- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CodeWarrior1241 0 7 июня, 2007 Опубликовано 7 июня, 2007 · Жалоба Ау Так получилось I2C с Microblaze гнать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться