le2x

Как переслать 64 бита в аппаратный регистр

16 сообщений в этой теме

le2x    0

Добрый день коллеги!

Имеется микроконтроллер STM32F103C8, к нему подключен внешняя микросхема - регистр разрядностью 64 бита. Управление происходит по трем линиям:

LATCH_DIO  - разрешение записи в регистр (LOW)

CLK_DIO  - синхронизация

DATA_DIO  - данные (последовательно, побитно)

Очень напоминает работу SPI поэтому и решил для начала попробовать приспособить его. Но ничего не вышло так-как по SPI в одном пакете может передать максимально 16 бит данных.

Полагаю что необходимо использовать GPIO для этого. Но вот беда не могу понять как из переменной извлечь биты данных и установить их на DATA_DIO последовательно? Или может быть есть еще какие-то решения? Разработку веду в CoIDE v.1.7

Изменено пользователем le2x
ошибка

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


Ссылка на сообщение
Поделиться на других сайтах
ALEN&Co    6
1 час назад, le2x сказал:

Но ничего не вышло так-как по SPI в одном пакете может передать максимально 16 бит данных

SPI может передать сколько угодно, но нужно вовремя подавать ему эту информацию.

Для этого служит DMA.

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


Ссылка на сообщение
Поделиться на других сайтах
Yurkin2015    310
4 часа назад, le2x сказал:

может передать максимально 16 бит данных

Вот и передайте 4 раза по 16 бит. А потом активируйте сигнал LATCH_DIO, по которому все переданные биты одним махом запишутся в регистр.

Для этого линией LATCH_DIO надо управлять вручную, а не соединять с сигналом SS от SPI. То есть на какой-то свободный GPIO выход вешаете этот самый LATCH_DIO и дергаете им, когда все 64 бита передано.

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


Ссылка на сообщение
Поделиться на других сайтах
le2x    0
45 минут назад, Yurkin2015 сказал:

Вот и передайте 4 раза по 16 бит. А потом активируйте сигнал LATCH_DIO, по которому все переданные биты одним махом запишутся в регистр.

Для этого линией LATCH_DIO надо управлять вручную, а не соединять с сигналом SS от SPI. То есть на какой-то свободный GPIO выход вешаете этот самый LATCH_DIO и дергаете им, когда все 64 бита передано.

Типа вот так что ли?

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_spi.h"

void delay (uint32_t time_delay) //функция задержки
{
    uint32_t i;
    for (i=0;i<time_delay;i++);
}

int main(void)
{
    // настраиваем выводы 4-7 порта A  на альтернативный режим работы
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // LATCH_DIO  - разрешение записи в регистр (LOW)
    GPIO_InitTypeDef latch;
    latch.GPIO_Speed = GPIO_Speed_2MHz;
    latch.GPIO_Mode  = GPIO_Mode_Out_PP;
    latch.GPIO_Pin = GPIO_Pin_8 ;
    GPIO_Init(GPIOA, &latch);
    GPIO_SetBits(GPIOA, GPIO_Pin_8); //устанывливаем на линнии запрет приема данных

    //выводы под SPI
    GPIO_InitTypeDef gpio;
    gpio.GPIO_Speed = GPIO_Speed_2MHz;
    gpio.GPIO_Mode  = GPIO_Mode_AF_PP;
    gpio.GPIO_Pin   = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_Init(GPIOA, &gpio);

    // настраиваем SPI1
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    SPI_InitTypeDef spi;
    spi.SPI_Direction = SPI_Direction_1Line_Tx;
    spi.SPI_Mode = SPI_Mode_Master;
    spi.SPI_DataSize = SPI_DataSize_16b;
    spi.SPI_CPOL = SPI_CPOL_Low; //полярность сигнала синхронизации
    spi.SPI_CPHA = SPI_CPHA_1Edge; //фронт синхронизации
    spi.SPI_NSS = SPI_NSS_Soft;
    spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    spi.SPI_FirstBit = SPI_FirstBit_MSB; //передавать сначала младший бит
    spi.SPI_CRCPolynomial = 7;
    SPI_Init(SPI1, &spi);
    SPI_Cmd(SPI1, ENABLE);

    GPIO_ResetBits(GPIOA, GPIO_Pin_8);
    SPI_I2S_SendData(SPI1, 0x80F1);
    SPI_I2S_SendData(SPI1, 0x80F2);
    SPI_I2S_SendData(SPI1, 0x80F4);
    SPI_I2S_SendData(SPI1, 0x80F8);
    GPIO_SetBits(GPIOA, GPIO_Pin_8);

    while(1)
    {

    }
}

 

Так не работает. Причем могу за комментировать строки GPIO_ResetBits(GPIOA, GPIO_Pin_8); GPIO_SetBits(GPIOA, GPIO_Pin_8); результат не меняется

Кстати пытаюсь к STM32 подключить Arduino Multifunction Shield http://arduinolearning.com/code/multi-function-shield-examples.php

И у них оно примерно так и работает:
 

digitalWrite(LATCH_DIO,LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
digitalWrite(LATCH_DIO,HIGH);

Проверял код из примера в ссылке на Arduino mega 2560,  этот шилд отлично все отображает

Изменено пользователем le2x

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


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    38
31 minutes ago, le2x said:

SPI_I2S_SendData(SPI1, 0x80F1);

После каждой передачи надо ждать освобождения регистра и только потом передавать новые данные.

После последней передачи надо дождаться окончания передачи и затем устанавливать

34 minutes ago, le2x said:

GPIO_SetBits(GPIOA, GPIO_Pin_8);

Для начала можно просто поставить везде задержки без проверки флагов

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


Ссылка на сообщение
Поделиться на других сайтах
Yurkin2015    310
34 минуты назад, le2x сказал:

Так не работает.

Возьмите нормальный пример SPI из интернета для Coocox. В Вашей программе не хватает проверки: перед отправкой очередного слова нужно проверять закончилась ли предыдущая процедура передачи.

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, 0x80F2);
и т.д.

Какая конкретно внешняя микросхема?

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


Ссылка на сообщение
Поделиться на других сайтах
le2x    0
    GPIO_ResetBits(GPIOA, GPIO_Pin_8);
    SPI_I2S_SendData(SPI1, 0x80F1);
    //delay (100000);
    while( !(SPI1->SR & SPI_I2S_FLAG_TXE) || SPI1->SR & SPI_I2S_FLAG_BSY );
    SPI_I2S_SendData(SPI1, 0x80F2);
    //delay (100000);
    while( !(SPI1->SR & SPI_I2S_FLAG_TXE) || SPI1->SR & SPI_I2S_FLAG_BSY );
    SPI_I2S_SendData(SPI1, 0x80F4);
    //delay (100000);
    while( !(SPI1->SR & SPI_I2S_FLAG_TXE) || SPI1->SR & SPI_I2S_FLAG_BSY );
    SPI_I2S_SendData(SPI1, 0x80F8);
    //delay (100000);
    while( !(SPI1->SR & SPI_I2S_FLAG_TXE) || SPI1->SR & SPI_I2S_FLAG_BSY );
    GPIO_SetBits(GPIOA, GPIO_Pin_8);

Попробовал и с задержкой и с проверкой флагов, бесполезно, он зажигает последний индикатор и все тут. Получается последней отрабатывает вот эта строка

SPI_I2S_SendData(SPI1, 0x80F8);

пробовал ее закоментить тогда зажигается третий индикатор, последней отрабатывает строка

SPI_I2S_SendData(SPI1, 0x80F4);

Хочу зажечь все четыре индикатора.

Изменено пользователем le2x

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


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

О, уже какие-то индикаторы появились. Что у Вас там за внешняя схема? Какие индикаторы и как они соединены?

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


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

Принципиальная электрическая схема и изображение платы во вложении.

Пины микроконтроллера:

LATCH_DIO - GPIO_Pin_8

CLK_DIO - GPIO_Pin_5

DATA_DIO - GPIO_Pin_7

apc220-bluetooth-voice-recognition-module.jpg

1457533970_untitled.png

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


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

Через spi должно б работать. Если нет, посомотрите примеры с 595 сдвиговым регистром, там всё просто, например так:

uint64_t inputData;    
for (i = 0; i < 64; i++)
	{
	if (inputData & 0x80000000)
	    {
	    HAL_GPIO_WritePin(DATA_DIO_PORT, DATA_DIO_PIN,
		    GPIO_PIN_SET);
	    }
	else
	    {
	    HAL_GPIO_WritePin(DATA_DIO_PORT, DATA_DIO_PIN,
		    GPIO_PIN_RESET);
	    }
	HAL_GPIO_WritePin(MCU_595_SH_GPIO_Port, MCU_595_SH_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(MCU_595_SH_GPIO_Port, MCU_595_SH_Pin, GPIO_PIN_RESET);
	inputData <<= 1;
	}

Можно между подъемом и спуском строба задержку небольшую сделать, что бы фронт успел нарастать. Но вообще должно бы и с spi работать. СPOL и СPHA правильно настроены?

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


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

Не понятно откуда 8 байт, если два 8-ми битных регистра.

Поставьте вмесо F8, FF и должены включитьсявсе индикаторы.

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


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

Я кажется понял свою ошибку, посмотрел внимательнее на схему и понял что не нужно никаких 64 бита передавать в регистр а всего 16. Первые байт отвечают за номер индикатора а второй значение на сегментах. Так что должно все получиться с SPI.

Цитата

Поставьте вмесо F8, FF и должены включитьсявсе индикаторы.

Да действительно так и есть, загорелись все 4 индикатора, правда не цифрами а кракозябрами, осталось подобрать правильные коды символов

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


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

В общем заработало в таком варианте

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_spi.h"

void delay (uint32_t time_delay) //функция задержки
{
    uint32_t i;
    for (i=0;i<time_delay;i++);
}

int main(void)
{
    // настраиваем выводы 4-7 порта A  на альтернативный режим работы
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // LATCH_DIO  - разрешение записи в регистр (LOW)
    GPIO_InitTypeDef latch;
    latch.GPIO_Speed = GPIO_Speed_2MHz;
    latch.GPIO_Mode  = GPIO_Mode_Out_PP;
    latch.GPIO_Pin = GPIO_Pin_8 ;
    GPIO_Init(GPIOA, &latch);

    //выводы под SPI
    GPIO_InitTypeDef gpio;
    gpio.GPIO_Speed = GPIO_Speed_2MHz;
    gpio.GPIO_Mode  = GPIO_Mode_AF_PP;
    gpio.GPIO_Pin   = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_Init(GPIOA, &gpio);

    // настраиваем SPI1
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    SPI_InitTypeDef spi;
    spi.SPI_Direction = SPI_Direction_1Line_Tx;
    spi.SPI_Mode = SPI_Mode_Master;
    spi.SPI_DataSize = SPI_DataSize_16b;
    spi.SPI_CPOL = SPI_CPOL_Low; //полярность сигнала синхронизации
    spi.SPI_CPHA = SPI_CPHA_2Edge; //фронт синхронизации
    spi.SPI_NSS = SPI_NSS_Soft;
    spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    spi.SPI_FirstBit = SPI_FirstBit_MSB; //передавать сначала младший бит
    spi.SPI_CRCPolynomial = 15;
    SPI_Init(SPI1, &spi);
    SPI_Cmd(SPI1, ENABLE);

    while(1)
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_8);
        SPI_I2S_SendData(SPI1, 0xC0F1);
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        GPIO_ResetBits(GPIOA, GPIO_Pin_8);
        delay(10000);

        GPIO_SetBits(GPIOA, GPIO_Pin_8);
        SPI_I2S_SendData(SPI1, 0xF9F2);
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        GPIO_ResetBits(GPIOA, GPIO_Pin_8);
        delay(10000);

        GPIO_SetBits(GPIOA, GPIO_Pin_8);
        SPI_I2S_SendData(SPI1, 0xA4F4);
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        GPIO_ResetBits(GPIOA, GPIO_Pin_8);
        delay(10000);

        GPIO_SetBits(GPIOA, GPIO_Pin_8);
        SPI_I2S_SendData(SPI1, 0xB0F8);
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        GPIO_ResetBits(GPIOA, GPIO_Pin_8);
        delay(10000);

    }
}

Сначала нужно установить 1 на LATCH_DIO, затем передать два байта по SPI, затем установить 0 на LATCH_DIO. Вот это как раз и странно, должно быть все наоборот. Получается LATCH_DIO нельзя подключить к SPI_NSS выходу, либо подключать через инвертор (элемент НЕ, транзистор по схеме с ОЭ). Но в примере для Arduino  все логично. Что тогда не так?

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


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

Во-первых, у Вас настройка SPI неправильная. Данные в 595 регистр задвигаются по положительному перепаду 0->1, поэтому, если полярность клоков выбрана Low, то фронт клоков нужно выбрать первый, т.е. по первому фронту после Low состояния клоков.

spi.SPI_CPOL = SPI_CPOL_Low; //полярность сигнала синхронизации
spi.SPI_CPHA = SPI_CPHA_1Edge; //фронт синхронизации

Во-вторых, флаг SPI_I2S_FLAG_TXE означает, что регистр передачи SPI опустел. То есть данные из регистра TX перешли в сдвиговый регистр SPI и начали выталкиваться наружу. Другими словами установка флага SPI_I2S_FLAG_TXE в 1 не означает окончание передачи по SPI.

Для проверки окончания есть другой флаг SPI_I2S_FLAG_BSY, который = 1 в процессе передачи и = 0, когда передача закончилась.

 

1 час назад, le2x сказал:

Сначала нужно установить 1 на LATCH_DIO,

Сигнал LATCH_DIO записывает данные на выходные линии тоже по положительному перепаду 0->1. То есть после задвигания всех 16 битов нужно каким-то образом организовать такой перепад на линии LATCH_DIO.

Например, так

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);// регистр TX пустой?
SPI_I2S_SendData(SPI1, 0xC0F1);// пишем в TX данные, начало передачи
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);// ждём окончания передачи
GPIO_ResetBits(GPIOA, GPIO_Pin_8);// делаем перепад на LATCH_DIO
GPIO_SetBits(GPIOA, GPIO_Pin_8);

 

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


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

Уважаемый @Yurkin2015 вы абсолютно правы. Надо было мне сразу заглянуть в даташит на 74HC595

и тогда бы я увидел эту диаграмму.

Безымянный.png

Поправил фронт и полярность в настройках GPIO. Ваш код действительно работает. Также он работает и в таком варианте когда сначала на линию LATCH_DIO  устанавливаем 0, передаем данные по SPI c проверкой флагов и устанавливаем на LATCH_DIO = 1, так что теперь все логично и понятно. Спасибо. Осталось поиграть с SPI_NSS дабы не задействовать отдельную ногу под LATCH_DIO

Изменено пользователем le2x

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


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

В общем понял что nss для работы в режиме slave и multimaster и что этот вариант мне не подходит управление осуществляю при помощи GPIO. Всем спасибо за помощь. Ниже рабочий код.

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_spi.h"

int main(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    //LATCH_DIO  - разрешение записи в регистр (LOW)
    GPIO_InitTypeDef latch;
    latch.GPIO_Speed = GPIO_Speed_2MHz;
    latch.GPIO_Mode  = GPIO_Mode_Out_PP;
    latch.GPIO_Pin = GPIO_Pin_8 ;
    GPIO_Init(GPIOA, &latch);

    //выводы под SPI CLK_DIO - GPIO_Pin_5, DATA_DIO - GPIO_Pin_7
    GPIO_InitTypeDef gpio;
    gpio.GPIO_Speed = GPIO_Speed_2MHz;
    gpio.GPIO_Mode  = GPIO_Mode_AF_PP;
    gpio.GPIO_Pin   = GPIO_Pin_5 | GPIO_Pin_7;
    GPIO_Init(GPIOA, &gpio);

    // настраиваем SPI1
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    SPI_InitTypeDef spi;
    spi.SPI_Direction = SPI_Direction_1Line_Tx;
    spi.SPI_Mode = SPI_Mode_Master;
    spi.SPI_DataSize = SPI_DataSize_16b;
    spi.SPI_CPOL = SPI_CPOL_Low; //полярность сигнала синхронизации
    spi.SPI_CPHA = SPI_CPHA_1Edge; //фронт синхронизации
    spi.SPI_NSS = SPI_NSS_Soft;
    spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    spi.SPI_FirstBit = SPI_FirstBit_MSB; //передавать сначала младший бит
    spi.SPI_CRCPolynomial = 15;
    SPI_Init(SPI1, &spi);
    SPI_Cmd(SPI1, ENABLE);


    while(1)
    {

    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);// регистр TX пустой?
    	SPI_I2S_SendData(SPI1, 0xC0F1);// пишем в TX данные, начало передачи
    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);// ждём окончания передачи
    	GPIO_ResetBits(GPIOA, GPIO_Pin_8);// делаем перепад на LATCH_DIO
    	GPIO_SetBits(GPIOA, GPIO_Pin_8);

    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);// регистр TX пустой?
    	SPI_I2S_SendData(SPI1, 0xF9F2);// пишем в TX данные, начало передачи
    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);// ждём окончания передачи
    	GPIO_ResetBits(GPIOA, GPIO_Pin_8);// делаем перепад на LATCH_DIO
    	GPIO_SetBits(GPIOA, GPIO_Pin_8);

    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);// регистр TX пустой?
    	SPI_I2S_SendData(SPI1, 0xA4F4);// пишем в TX данные, начало передачи
    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);// ждём окончания передачи
    	GPIO_ResetBits(GPIOA, GPIO_Pin_8);// делаем перепад на LATCH_DIO
    	GPIO_SetBits(GPIOA, GPIO_Pin_8);

    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);// регистр TX пустой?
    	SPI_I2S_SendData(SPI1, 0xB0F8);// пишем в TX данные, начало передачи
    	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);// ждём окончания передачи
    	GPIO_ResetBits(GPIOA, GPIO_Pin_8);// делаем перепад на LATCH_DIO
    	GPIO_SetBits(GPIOA, GPIO_Pin_8);

    }
}

 

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


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...

  • Похожие публикации

    • Автор: Anton Klapatun
      День добрый!
       
      Имеется sim-карта со статическим IP и модем SIM800C, который через UART соединен с STM32F0.
      Прочитав статью на хабре, которая и являлась отправной точкой, было решено повторить подвиг, но в версии lwip 2.0.3, которой я пользуюсь, ppp изменился до неузнаваемости, что сначала внесло некоторый сумбур. Но в документации к lwip был найден текстовый файл с настройкой ppp-соединения (ppp.txt, прикреплю его ниже), в котором было все, что нужно для счастья, но когда модем начал общаться с контроллером, дальше фазы LCP дело не зашло. Как я понял из документа (ppp_connect.docx), который оказался у меня уже-и-не-помню-откуда, после конфигурирования параметров соединения в фазе LCP контроллер должен посылать в модем пакет с заголовком PAP (C0 23), но он почему-то этого не делает... Он вообще больше ничего не делает. Я пытался проследить в отладчике весь путь запроса, что приходит от модема, но это только больше меня запутало.
      Собственно, прием данных у меня организован через прерывание. После ввода AT-команды "ATD*99***1#" и получения ответа "CONNECT", устанавливается флаг "ppp_enable" и при приходе байта он кладется в очередь `xQueue_PPP_Package`.
      void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { uint8_t u8; if(huart == &huart1) { if (ppp_enable == true) { portBASE_TYPE xHigherPriorityTaskWoken_PPP_Rx; u8 = Sim800.UsartRxTemp; xHigherPriorityTaskWoken_PPP_Rx = pdFALSE; xQueueSendFromISR(xQueue_PPP_Package, &u8, &xHigherPriorityTaskWoken_PPP_Rx); } else { /*Reception of AT commands*/ } HAL_UART_Receive_IT(&huart1,&Sim800.UsartRxTemp,1); } } В задаче `StartLwIPTask` в бесконечном цикле проверяется эта очередь и при появлении элементов, записывает их в массив `PPPx.Data` и при фиксации второго HDLC-заголовка (0x7E), отправляет данные в lwip функцией `pppos_input`.
      P.S. Переменная `PPPx.Last_Index` это размер пришедшего ppp-пакета.
      void StartLwIPTask(void const * argument) { /* USER CODE BEGIN StartLwIPTask */ /*Создаем очередь*/ xQueue_Sim800_Package = xQueueCreate(128, sizeof(uint8_t)); xQueue_PPP_Package = xQueueCreate(128, sizeof(uint8_t)); uint8_t u8=0; volatile int setup = 0; tcpip_init( NULL, NULL ); /*Инициализация стека tcp/ip*/ /*Create a new PPPoS interface*/ ppp = pppos_create(&ppp_netif, output_cb, status_cb, 0); // /* Auth configuration, this is pretty self-explanatory */ ppp_set_auth(ppp, PPPAUTHTYPE_PAP, "beeline", "beeline"); /* Require peer to authenticate */ ppp_set_auth_required(ppp, 1); /*Only for PPPoS, the PPP session should be up and waiting for input.*/ ppp_set_silent(ppp, 1); /* * Initiate PPP listener (i.e. wait for an incoming connection), can only * be called if PPP session is in the dead state (i.e. disconnected). */ ppp_listen(ppp); /* Infinite loop */ for(;;) { if (sim800_init() == S_RESET) /*Настройка модуля Sim800*/ continue; for (;;) { if (pdPASS == xQueueReceive(xQueue_PPP_Package, &u8, 100/portTICK_RATE_MS)) { if (u8 == 0x7E) t++; PPPx.Data[PPPx.Last_Index++] = u8; if (t==2) { PPPx.Last_Index--; pppos_input(ppp, PPPx.Data, PPPx.Last_Index); t=0; memset(&PPPx, 0, sizeof(PPPx)); } } } } /* USER CODE END StartLwIPTask */ } Как я писал выше, все идет хорошо, пока идет фаза LCP, но после подтверждения контроллера запроса опций, наступает тишина.
      В интернете мне удалось найти довольно мало исчерпывающей информации и примеров по связке stm32+lwip+ppp, если кто-нибудь занимался подобным или сталкивался с похожей проблемой, буду очень признателен за помощь и за пинки в нужном направлении. Заранее спасибо.
       
       
      ppp.txt
      ppp_connect.docx
    • Автор: agbp
      Приветствую! 

      Мы - молодой стартап из Санкт-Петербурга с хорошей финансовой поддержкой. Создаём дроны.
      Нам не хватает серьезного программиста на полный загруженный график (можно удаленно). 

      Из основных задач, которые нужно будет решать: 
      1. Программа отслеживания объекта в видеопотоке (процессор STM32F4xx). 
      2. Программа стабилизации БПЛА по данным с гироскопа и наведение на цель. 
      3. Создание программы управления бесколлекторным двигателем по закрытому контуру с возможностью бесшовной интеграции с программой просчёта траектории ЧПУ станка. 
      4. Программирование бортового комплекса управления БПЛА (автопилот) 
      5. Полный пакет работ по созданию бортового и наземного комплексов управления роем БПЛА. 
      Оформление в штат. 
      ЗП обсуждаема, от 60 000 в месяц.
      P.S. дроны, беспилотники, авиамодели... это только начало!
    • Автор: Djanger
      Приобрёл "NUCLEO-F030R8, Отладочная плата на базе MCU STM32F030R8T6 (ARM Cortex-M0), ST-LINK/V2-1, Arduino-интерфейс"  хочу приобрести два модуля к ней но не знаю о совместимости , кого спрашиваю сомневаются и не отвечают уверенно, 1 модуль это 3,2 TFT ЖК дисплей сенсорный , а второй 8 бит LED 8 бит цифровой Tube 8-разрядный ключ. Кто что может подсказать или посоветовать прошу помочь 


    • Автор: alexmurphy
      Здравствуйте!

      Разовая работа для программистов из Москвы или московской области.

      Необходимо написать прошивку для отладочной платы на базе чипа BMI055
      Даташит: https://www.mouser.com/ds/2/783/BST-BMI055-DS000-08-786482.pdf

      Более подробное ТЗ вышлю кандидату.
      Железо предоставлю.
      Оплата по договоренности.

      При успешном выполнении, будут регулярные заказы, а также трудоустройство при желании, конкурентная зп по Москве.

      Если заинтересованы, просьба в комментах или в ЛС оставить контакты для связи.
    • Автор: Smith2007
      Исследую платку stm32f103c8t6.
      В качестве ide - Keil mVision v5.
      Проект на Си++
      При работе с UART мне требуется вывести некоторую информацию. Делаю это при помощи следующих функций:
      void USARTSend(char *ptrOutBuf) { while (*ptrOutBuf) { USART_SendData(USART1, *ptrOutBuf++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} } } void USARTSend(int val) { int i = 0; sprintf(buffer, "%x", val); while (buffer[i]) { USART_SendData(USART1, buffer[i]); i++; while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} } } void USARTSend(const unsigned char *ptrOutBuf) { while (*ptrOutBuf) { USART_SendData(USART1, *ptrOutBuf++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { } } } В некоторых строках вывожу текст следующим вызовом:
      USARTSend("\r\nUSART1 is ready.\r\n"); Компилируется без ошибок.
      Вывод сообщений в UART тоже без ошибок.
      Но в редакторе кода Keil  на против последней записи появляется значок warning!

      Код выполняется верно

       
      Как можно избавиться от неприятного предупреждения?
  • Сообщения

    • "Начальный бросок" при подаче питания (иногда встречается в подобных схемах) не имеет никакого смысла. Вернее имеет смысл только в тех схемах, где кулер вращается с самого начала, даже если весь во льду. Но обычно при включении никакого охлаждения не требуется, нагрев излишний появится когда-то потом (может быть) и только тогда (при условии, что будут попытки запустить кулер на нерасчетных для него минимальных оборотах) может понадобиться некий толчок. 
    • Мои 1 коп  в тему .  Если делать "правильную схему" , то на дискрете она получится  слишком большой , тогда надо  МК (плюс получается возможность изменять прошивку ). Потому лично я пошел по пути простоты схемы и гибкости регулировок , отказавшись от старта от 6 В . (Добавив один компаратор  можно и это реализовать ) Терморегулятор собран на одном ОУ U8 и подключается к нестабилизированному питанию F5 (13-16В) в линейном источнике питания .   Настройка нулевого напряжения на кулере порядка 40гр. , 6В на кулере получается примерно при 50 гр. При 65гр. срабатывает компаратор отключение выхода .  Для гибкости схема имеет 4-ре подстроечника . Работает так : до 50гр. - тишина ,  потом вентилятор быстро набирает обороты (заметно шумит) Согласен с VSLZ  в простой схеме можно обойтись без стартового напряжения . .   
    • Чтобы ощутить стерео эффект от такого устройства, необходимо находится от него на расстоянии примерно равном, расстоянию между динамиками 
    • Подскажите как исправить неполадку.У меня пропал звонок на входящих sms.
    • А при подаче на стоящий на месте кулер напряжения 4-5 вольт  (при котором он гарантировано не сможет крутиться) куда эта энергия будет уходить? не в тепло?  Вот потому мне кажется, что не нужно на кулер подавать малое напряжение. Будет все равно на месте стоять, дергаться, рассеивать тепло... А в нужный момент сразу 6-7 вольт и кулер гарантировано заработает. 
    • Портативные магнитофоны, делали то же стерео, там тот же эффект. Всё равно чуть лучше чем моно, но в целом панорама узкая. Решение явно компромиссное, рассчитанное на лёгкость транспортировки.   
    • @dima1967 и  @РадиоНастройщик, создайте тему и попросите модераторов перенести туда ваши сообщения. Тема интересная, но тут она не к месту. Я подожду чуток и потом сам попрошу удалить их. Всё таки это тема про "Синусоидальный генератор НЧ на КПЕ"