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

    

Connor

Участник
  • Публикаций

    44
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Connor

  • Звание
    Участник
  1. Как в Java изменять состояние переменной супер класса при создании нового объекта класса наследника? К примеру есть классVehicle, который хранит количество машин numberOfVehilces, я наследую от него класс LightVehicle и каждый раз при создании объекта этого класса я хочу увеличивать numberOfVehilces на один, как это можно реализовать?
  2. stm32 SPI

    Цитата(AlanDrakes @ Apr 24 2018, 06:58) Частота обмена ВСЕГДА зависит от частоты мастера. Ведомый кристалл только выставляет соответствующий уровень на пине MISO в момент(ы) смены тактового сигнала SCK. Необходимое условие - частота обмена не более четверти тактовой частоты ведомого чипа. Заметьте, тактовой частоты его периферии. Приведу пример: Мастер: 8МГц. Ведомый: 8МГц. SPI мастера тактируется от внутренней частоты с делителем /2. Результатирующая - 4МГц (внутренняя) и 2МГц (максимальная частота на пине SCK (здесь я имею в виду полную смену тактового сигнала 0-1-0)). SPI ведомого тактируется от внутренней шины с делителем /4. Результатирующая - 2МГц (вроди бы, совпадает с внешней), но максимальная внешняя - 1МГц (тот же полный импульс 0-1-0). Так что, мастер должен дёргать пином минимум в 2 раза медленнее. 500кБод - вполне достаточно 1МГц на шине. На шине ведомого. Ну и мастер должен с этой частотой данные читать. Спасибо, это действительно логично Цитата(k155la3 @ Apr 24 2018, 09:21) Используйте стандартные методы. Если слейв должен возвратить "быстрые" данные (например выборка параметра из RAM) то для этого таймауты не нужны и все можно "прокрутить" в одном запрос-ответе. Если же нужна задержка на подготовку данных (например отработка ADC) то это делается "наразвес", несколькими командами 1. Старт АЦП в слейве. 2. опрос регистра статуса слейва готовности данных АЦП. 3. Чтение слейва - данных АЦП. В том и проблема, что именно в такой системе как реализовано у меня, АЦП конвертируют данные, DMA записывает их в буфер, который копируется ещё в один (на отправку мастеру), по приходу флага копирование данных в этот буфер прекращается и я отправляю этот буфер мастеру, но как я уже говорил, флаг у меня приходит, срабатывает прерывания, на слэйве запускается DMA по Rx запросу, но чтобы мастер начал читать адекватные данные, когда я начинаю слать слэйву "мусор", нужно выждать что-то около 500мс, что очень плохо, потому что обновлять данные я должен несколько раз в секунду, поэтому решением этой ситуации, как мне подсказали выше, это реализовать просто обмен по DMA без всяких флагов, что я уже сделал и что гораздо проще в итоге
  3. stm32 SPI

    Всем спасибо за ответы, очень помогли К слову работаю я на довольно низкой частоте 500 кбод/c, но я так понимаю скорость обмена зависит от тактовой частоты мастера, а не слейва?
  4. stm32 SPI

    Получилось у меня реализовать обмен по дма между мастером и слэйвом с помощью прерывания, только у меня это танцы с конём получились, после принятия флага на чтение, приходится отключать прерывания по RXNE для слейва, чтобы слейв не ловил его, когда мастер начнёт посылать "мусор": Кодvoid SPI2_IRQHandler() {     SPI_FLAG = SPI_I2S_ReceiveData16(SPI2);         /* Disable RXNE interrupt*/     SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, DISABLE);     if(SPI_FLAG == 0x0001)     {         DMA_Cmd(DMA1_Channel5, ENABLE);     } } в общем итоге "мусор" для принятия данных от слейва мастером мне приходится посылать только через >= 1 cек, то есть между отправкой флага и отправкой "мусора" от мастера проходит секунда, что меня совсем не радует, в противном случае слейв не успевает выставить в регистр DR данные и мастер читает нули Извиняюсь, я обманул сам себя а в итоге и вас, задержка получилась около 300мс, что к слову тоже многовато конечно(
  5. stm32 SPI

    Цитата(Сергей Борщ @ Apr 23 2018, 01:33) Ведомый не может ничего отправить пока ведущий это что-то не захочет забрать. В прерывании вы можете положить данные в регистр отправки, зарядить ПДП на отправку, но сама отправка произойдет только тогда, когда ведущий будет посылать данные, и в это же время в обратную сторону будет происходить отгрузка данных ведомым. Если ведомый ничего не зарядил на отправку - ведущий будет постоянно получать последние данные, лежащие в регистре отправки ведомого. Я это осознал, другой вопрос заключается в том, что на мастере необходимо организовывать задержку перед отправкой "мусора", например, чтобы принять данные от слэйва(в котором включается дма в прерывании)?
  6. stm32 SPI

    Цитата(k155la3 @ Apr 21 2018, 08:02) Я предлагаю Вам для старта упростить задачу. Проверьте работу мастера без слейва на корректность передачи "по кольцу" в заданном режиме (с DMA или без него). 1. соедините MISO-MOSI. 2. передайте "константно-инкриментный" массив. 3. проверьте соответствие принятогго переданному. Если этот "номер" в требуемом режиме настройки прошел, можно подключать "клиента-слейва". Как вариант - чтобы не отлаживать одновременно клиент-сервера на 2 платах - можете реализовать такое кольцо на двух SPI в рамках вашей Б1 (Slave). кольцевой обмен данными я реализовывал на мастере, всё было отлично, но вот со слэйвом были проблемы, вопрос, который до сих пор "меня мучает" это возможно ли из прерывания как-то отправить сообщение от слэйва мастеру
  7. stm32 SPI

    А ещё такой вопрос, есть ли необходимость софтового управления NSS сигналом, то есть дёргать gpio перед отправкой посылки? Я так понимаю "софтовость" заключается в том, что мы можем дёргать просто не подключенную ногу, вместо хардварной NSS? Просто я до этого ничего с NSS не делал, в смысле для этой задачи его не трогал
  8. stm32 SPI

    Цитата(Сергей Борщ @ Apr 21 2018, 04:22) Как и любую другую пересылку с использованием ПДП. Почему бы и да? Спасибо)
  9. stm32 SPI

    а как это можно реализовать с помощью DMA? По DMA отравплять и по DMA получать?
  10. stm32 SPI

    Есть две борды борда 1(Б1) (stm32f407vgt) и борда 2(Б2) (stm32f303vet), между которыми необходимо обеспечить связь по SPI, вот настройка SPI для Б1 и Б2: Б1 (Slave): CODE/* SPI2 De Initialization */ SPI_I2S_DeInit(SPI2); /* SPI2 configuration */ SPI_InitTypeDef SPI2_InitStructure; SPI2_InitStructure.SPI_Mode = SPI_Mode_Slave; SPI2_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI2_InitStructure.SPI_DataSize = SPI_DataSize_16b; SPI2_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI2_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI2_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI2_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI2_InitStructure.SPI_CRCPolynomial = 7; SPI2_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_Init(SPI2, &SPI2_InitStructure); /* FIFO threshold */ SPI_RxFIFOThresholdConfig(SPI2, SPI_RxFIFOThreshold_HF); /* Interrupt handler priority */ NVIC_InitTypeDef NVIC_SPI2_InitStructure; NVIC_SPI2_InitStructure.NVIC_IRQChannel = SPI2_IRQn; NVIC_SPI2_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_SPI2_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_SPI2_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_SPI2_InitStructure); /* RXNE interrupt enable */ NVIC_EnableIRQ(SPI2_IRQn); SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE); /* Enable DMA Tx requests */ SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); /* Enable SPI2 */ SPI_Cmd(SPI2, ENABLE); Б2(Master): CODE/*SPI3 configuration structure*/ SPI_InitTypeDef SPI3_InitStructure; /*Default parameters*/ SPI_StructInit(&SPI3_InitStructure); /*Configure SPI3*/ SPI3_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI3_InitStructure.SPI_Mode = SPI_Mode_Master; SPI3_InitStructure.SPI_DataSize = SPI_DataSize_16b; SPI3_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI3_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI3_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI3_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; SPI3_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI3_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI3, &SPI3_InitStructure); /*Enable SPI3*/ SPI_Cmd(SPI3, ENABLE); между ними необходимо передавать данные нижеописанным образом: 1. Б2, который мастер, шлёт 16-битный флаг SPI_FLAG (0x0001); 2. Срабатывает прерывание по RXNE в Б1, Б1 читает принятую посылку, сравнивает с нужным значением и включает DMA_Stream, который запускает передачу данных в Б2 Кодvoid SPI2_IRQHandler() {     SPI_FLAG = SPI_I2S_ReceiveData16(SPI2);          if(SPI_FLAG == 0x0001)     {          DMA_Cmd(DMA1_Channel5, ENABLE);     } } Частота на шине APB1, где находится SPI3 Мастера 32MГц, с baudrateprescaler = 64 частота обмена 500Кбит/c . Теперь о проблемах, SPI_FLAG слэйвом я принимаю, а вот данные отправить ни как не получается, только если напрямую в коде где-то написать SPI_I2S_SendData, т.е. из прерывания я не могу отправить данные даже таким способом. Может я неправильно понимаю работу SPI? Подскажите пожалуйста в чём может быть проблема. Лично я грешу на софтовый NSS, я так понимаю при отправке данных слэйвом мастеру, мастер не генерит SCK, может ли помочь решить проблему использование хардварного NSS? Спасибо
  11. 1-wire интерфейс

    Ладно, ребят, тему можно закрывать, всем данке шон
  12. 1-wire интерфейс

    Цитата(domowoj @ Mar 30 2018, 13:20) А какой смысл использовать этот кристалл СТМ на такой низкой частоте? На плате много других устройств, которые работают на более высокой частоте и расположены они очень близко, и был уже негативный опыт частотных искажений в связи с работой стм на близкой частоте
  13. 1-wire интерфейс

    Цитата(kolobok0 @ Mar 30 2018, 12:44) Спасибо, я понимаю, но у меня даже не получается сделать задержку кратной 5 мкс или 15, и на сколько я помню разрешение у него 8бит, а это 1 градус в диапазоне от -55 до +170 что ли или около того. Мне, при решении данной задачи, стало интересно именно реализация задержки, ведь на 1МГц один клок это 1мкс, один такт, в принципе теоретически такая задержка возможна...
  14. 1-wire интерфейс

    да гуглил я гуглил!))ничего толкового не нашёл для себя, из реализации задержек в мкс в основом только DWT, а рабочий пример что я видел для one wire был на 72МГц
  15. 1-wire интерфейс

    Хочу реализовать 1 wire интерфейс для общения между stm32f303ve и температурным датчиком ds1821,но есть такая проблема, я работаю на 1Мгц (HCLK) и у меня не получается сделать точную задержку времени, что для 1wire весьма критично, ведь он завязан на таймингах. Может кто-нибудь подсказать как можно реализовать точную задержку, скажем, в 1 микросекунду и возможно ли это реализовать на stm на такой частоте ядра? Дело ещё в том, что когда мы подаём сигнал на какую-то ножку, также необходимо время пока сигнал достигнет нужный величины (Vdd, к примеру),судя по даташиту оно должно быть около 125 НАНОсекунд на частоте в 2Мгц, но как я не пытался время задержки у меня получается минимально около 50мкс с помощью DWT, что очень много, буду рад вашим мыслям и советам, спасибо