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

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

Согласен... Но предполагалось что пока -=Vitaly=- отлажевает код, работать с MySpi ему придется только внутри его отладочной функции. А потом он бы разобрался :biggrin: .

2 -=Vitaly=-:

Пришлите Вашу xspi_i.h файл (?), моя приложена к этому post. Может diff сделайте с Вашим?

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


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

Пока сделал так, проверил работает, правда приходится 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();          
}

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


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

2 -=Vitaly=-:

Я попробовал зделать EDK8.2 проект используя код который я привел выше. Все работало, и проблем с xspi_i.h небыло... Архив проекта не умещается здесь, поставил на http://slil.ru/24404862. Я вывел все на ISE, но этим не обязательно пользоватся, если Вы введете .ucf файл под Вашу плату в XPS все сработает и так.

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


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

2 -=Vitaly=-:

Я попробовал зделать EDK8.2 проект используя код который я привел выше. Все работало, и проблем с xspi_i.h небыло... Архив проекта не умещается здесь, поставил на http://slil.ru/24404862. Я вывел все на ISE, но этим не обязательно пользоватся, если Вы введете .ucf файл под Вашу плату в XPS все сработает и так.

Спасибо, обязательно посмотрим. Я щас работаю под 9.1

Рановато наверное начал, говорили же люди до 3го сервиспака ни-ни!! :01:

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


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

Работает так как сказал CodeWarrior, но я не инклудил xspi_i.h и у меня он не молотит все время пачки, а затыкается через некоторе время.

Так что имеем теперь 2 метода работы с SPI - мой и правильный :beer:

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

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


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

Работает так как сказал CodeWarrior, но я не инклудил xspi_i.h и у меня он не молотит все время пачки, а затыкается через некоторе время.

Так что имеем теперь 2 метода работы с SPI мой и правильный :beer:

Нащет этoй header, на ней написано "for internal use only", поэтому наверно explicitly присоиденять её не надо... Вроде все что надо присоиденять находится в /microblaze_0/include.

Рановато наверное начал, говорили же люди до 3го сервиспака ни-ни!! :01:

lol, мы сами еще на 9.1 flow не перешли, наш админ как раз по этим сооброжениям и действует.

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


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

Подскажите есть ли стандартная функция в 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 то же самое. В чем секрет?

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

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


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

почему в функцию

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

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

Чесно говоря, я и имел DeviceID в виду, возможно это не самый лучший выбор для названия константов. Наверно так получилось из за cut and paste :biggrin: . Если это был бы реальный проект, скорее всего где нубудь в header-е я бы имел таблицу возможных slaves, их названия и соответствущию нумерацию.

И еще мне не совсем понятно почему маски в xspi_l.h и xspi.h указывающие на один и тот же бит (например в регистре статуса) имеют разные значения в 2х хедерах. С I2C то же самое. В чем секрет?

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

 

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

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


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

Чесно говоря, я и имел DeviceID в виду, возможно это не самый лучший выбор для названия константов. Наверно так получилось из за cut and paste :biggrin: . Если это был бы реальный проект, скорее всего где нубудь в 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: Почему нельзя было сделать дефайны общими??

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

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


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

Подскажите есть ли стандартная функция в 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);  
          }
            
}

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


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

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

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

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

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

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

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

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

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

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