Jump to content

carlogulliani

Members
  • Content Count

    33
  • Joined

  • Last visited

Community Reputation

0 Обычный

About carlogulliani

  • Rank
    Новенький

Электроника

  • Стаж в электронике
    Менее года

Recent Profile Visitors

914 profile views
  1. Вот решение void SPI1_IRQHandler(void) { if (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)) { RX_BUF[index] = SPI_I2S_ReceiveData(SPI1); index++; if(index >= RX_LEN) { index = 0; print_buf(32); } } } Спасибо за помощь. Код в первом посте действительно с ошибками, так как из проекта выдирал куски и дописывал уже в дело стенде недостающие объявления, где-то глаз замылился
  2. Проблема решилась. В SPI1_IRQHandler я считывал данные в цикле, надо было писать в буффер, инкрементируя его индекс. Вроде получается, что пришёл один байт, а я в цикле его BUF_LEN раз читаю. Ещё переписал немного обработчик, доберусь до компа, выложу решение
  3. Код работает, до момента приемки данных. А в чем "явные ошибки"??? Что не так с GPIO? На текущий момент есть задача использовать stdperph, причем тут HAL?
  4. в main.c есть бесконечный цикл, где постоянно опрашиваются датчики, управляется светодиодами и тд. И вот когда срабатывает прерывание на приемку SPI, после чтения всех байтов - управление не возвращается и бесконечный цикл не возобновляется (светодиоды не мигают а находятся в последнем состоянии перед прерывание, принт не печатает). Пакет данным у меня 32 байта, при этом в самом прерывании все 32 байта считываются. Если убрать while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); в ф-ции SPI_RW(), то бесконечный цикл работает, но каждый байт считывается по много раз (иногда слишком много) - то есть проблема либо с этим циклом, либо с приоритетом прерывания у SPI, пробовал ему 7 выставлять - то же самое. Я собрал тестовый стенд с минимум кода, где эта проблема воспроизводится // SPI.c #include "SPI.h" #include "stdio.h" #include "stm32f10x.h" void SPI_Init(void) { GPIO_InitTypeDef GPIO_InitDef; SPI_InitTypeDef SPI_InitDef; // initialize init structs GPIO_StructInit(&GPIO_InitDef); SPI_StructInit(&SPI_InitDef); // initialize clocks RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); // initialize A4/SS alternate function open-drain (50 MHz) GPIO_InitDef.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6; GPIO_InitDef.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitDef); // initialize A5/SCK alternate function open-drain (50 MHz) GPIO_InitDef.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; GPIO_InitDef.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitDef); // initialize SPI slave // for slave, no need to define SPI_BaudRatePrescaler SPI_InitDef.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitDef.SPI_Mode = SPI_Mode_Slave; SPI_InitDef.SPI_DataSize = SPI_DataSize_8b; // 8-bit transactions SPI_InitDef.SPI_FirstBit = SPI_FirstBit_MSB; // MSB first SPI_InitDef.SPI_CPOL = SPI_CPOL_Low; // CPOL = 0, clock idle low SPI_InitDef.SPI_CPHA = SPI_CPHA_1Edge; // CPHA = 1 SPI_InitDef.SPI_NSS = SPI_NSS_Soft; // use hardware SS SPI_InitDef.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; // APB2 72/64 = 1.125 MHz SPI_InitDef.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitDef); SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE); SPI_Cmd(SPI1, ENABLE); NVIC_EnableIRQ(SPI1_IRQn); NVIC_SetPriority(SPI1_IRQn, 7); printf("SPI bus init success...\r\n"); } void SPI_RW() { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_IT_RXNE) == RESET); return SPI_I2S_ReceiveData(SPI1); } // main.c #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_spi.h" #include "SPI.h" #ifdef OS_USE_SEMIHOSTING extern void initialise_monitor_handles(void); #endif static void SysTickConfig(void) { /* Setup SysTick Timer for 10ms interrupts */ if (SysTick_Config(SystemCoreClock / 1000)) { /* Capture error */ while (1); } /* Configure the SysTick handler priority */ NVIC_SetPriority(SysTick_IRQn, 1); // if I change Priority to 0 then I can't catch SPI' interruption } uint8_t RX_LEN = 32; uint8_t RX_BUF[RX_LEN] = {0}; void print_buf(uint8_t len) { for (uint8_t i=0; i<len; i++) { printf("0x%02x \r\n", RX_BUF[i]); } printf("\r\n"); } void SPI1_IRQn(void) { for (uint8_t i=0; i<RX_LEN; i++) { RX_BUF[i] = SPI_RW(); } print_buf(RX_LEN); } void main() { /* Enable semihosting */ #ifdef OS_USE_SEMIHOSTING initialise_monitor_handles(); #endif /* SysTickConfig */ SysTickConfig(); SPI_Init(); while(1) { printf("hello\r\n"); } } Помогите разобраться и пофиксить этот баг
  5. Я имел ввиду резервуар в диспенсере, но судя по-всему его там нет
  6. Спасибо! А что значит стравливать? Устройство не разбирал, но предполагаю, что там есть свой резервуар для воздуха, я же могу по монометру отследить, например, наполнение до 90%?
  7. Добрый день, прошу совета. Приобрел у китайцев диспенсер AD-982 для паяльной пасты. Расчитанно на давление 2.5 - 7 бар, вопрос в следующем, что будет, если я подключу к нему автомобильный компрессор (10-12 бар), не хочется покупать отдельный компрессор для этой штуки, так как большую часть он будет стоять и занимать место. Автомобильный планирую питать через блок питания (220 -> 12) с необходимым током
  8. Ну соответственно 4-5А. А контроллер от такого тока не сгорит?
  9. Верно, соответственно блок на 12В 2А, он же идёт на дисплей и от него же через этот конвертер питаю малину?
  10. Я смотрел коробочное решение типа https://www.fasttech.com/product/1270309-5v-2a-12v-25a-dual-output-regulated-switching-pow но это мне нравится больше. Получается на вход сколько ампер надо с учетом того, ещё дисплей. 6-8?
  11. Dc/dc громоздких размеров, хотелось бы решение в виде блока питания как для led лент, ну на край блок как для ноута. Вот и хотел напрямую 12 вольт от блока кинуть на контроллер дисплея, а что-то типа кренкой 12 в преобразовать в 5.
  12. Получается, взять питание на 6-8А, чтобы и не грелось. А что посоветуете по LDO?
  13. Добрый день! Вопрос немного из школьной физики, но тем не менее) хочу одним блоком питания запитать 2 устройства: контроллер дисплея (потребляет 12В, 2А) и распберри (потребляет 5В, 2А). Есть блок питания от какого-то роутера на 12В, 3А. Получается суммарная мощность блока 36Вт, суммарная мощность потребителей 34Вт. Запаса почти нет, стоит ли им питать два устройства? На распберри думаю пропустить Vin через Lm7805, он как раз на выходе даёт 5В 2А. Надо ли либо питание для дисплея пропускать через LDO? Еще вопрос, много ли тепла будет выделять LDO?надо ли его вешать на радиатор?
×
×
  • Create New...