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

BlackOps

Свой
  • Постов

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

  • Посещение

Весь контент BlackOps


  1. Я сразу заметил одно отличие: Когда вы экспортируете нетлист, и потом запускаете Allegro PCB Designer (Performance L) вы отмечаете опцию High-Speed! Но у меня ее нет вообще! Хотя у меня полный пакет 16.6 стоит , вот прикрепляю картинку моего запуска PCB Editor Так может это проблема? п.с. Может это тоже является проблемой в соседнем топике где я постю о том что у меня не работает авто-тюнинг?
  2. У меня функция эта вообще не работает, не то что бы работает не ахти, а вообще не работает! Может я чтото не правильно включил? вот мои действия: 1) Создаю согласованную пару в СМ, выбираю Pin Pairs как Longest Pin Pair 2) Жну кнопку Analyze, и вижу например красным отмечен Margin, т.к. одна дорожка короче чем TARGET 3) возвращаюсь в PCB Editor затем Route->AiDt, затем нажимаю на короткую дорожку, и вижу в консоле: Clines Selected: 1; Timing constraints: 1; Timing violations: 1; Outside ideal range: 1 И все, никакого сдвига, дорожка даже слегка не изменилась! Действия правильные или что-то я упустил еще? п.с. я заметил тут отмечают опцию High-Speed во время запуска, но этой опции у меня нету при запуске PCB Editor, может в этом и вся проблема? а если этой опции у меня нету то почему? ведь 16.6 что в закромах он то полный и все должен включать?
  3. ну ладно, поделитесь тогда как вы ровняете сигналы? скажем 20 сигналов, надо чтобы равная задержка была, и что в ручную делаете? Мне просто интерестно каким еще методом можно быстро разровнять несколько сигналов?
  4. Карлсон, у вас с каким хотфиксом заработало 007 или 008? vitan а может у меня именно на PCB Editor показывает 007 т.к. данный хотфикс к этому пакету не делал обновлений а обновил например другие пакеты внутри софта? у Вас что показывает на PCB Editor 008 или 007?
  5. назначил, вроде получилось выдал он мне что: DEFAULT_RESISTOR_49.9OHM но как теперь сделать так чтобы вся задержка линии учитывалась? скажем от чипа идет короткая дорожка, затем серийно резистор, затем длинная линия к коннектору. тоже самое с другим сигналом, идет от чипа дорожка, резистор, и другая длинная линия к коннектору другому. Мне нужно чтобы оба сигнала имели одинаковую задержку, модель резистора уже вписана, но как сделать так чтобы короткая дорожка, резистор, и длинная дорожка каждого сигнала принадлежали как бы к одной *линии задержки* ?
  6. Ну как же так.. ведь в тех онлайновых роликах столько сигналов сразу выравнивается! Я пробовал как я уже говорил на других парах, где например два сигнала друг за другом стоят, места навалом, один сигнал только надо увеличить в длинне, тоже не работает! Я пробовал увеличить процент толерантности аж на 30%, всеравно не работает! может всетаки еще чтото есть там? Как эффективно можно это сделать? Может другой пакет надо запустить? Я запускаю: Allegro PCB Editor GXL, [Analog RF] Да и еще, я тот Хотфикс что вы залили установил, после него у меня почемуто Allegro Design Entry CIS пишет что версия 008, но вот Allegro PCB Editor GXL пишет что версия 007, почему так?
  7. читаю мануал, и вроде чтобы это сделать надо свойство CDS_XNET_NAME какого либо сигнала выставить как SELECT, но я не вижу пока где именно это свойство вытащить и выставить так? п.с. мне это нужно для того чтобы выставить равную задержку на обе линии внутри каждой из которых серийно включен ресистор например. (или есть метод более удобный это сделать?)
  8. Ну вот например мои дорожки, DIN1 и DIN2, левый и правый SMA коннектор соединенные к чипу. DIN1 длиннее, поетому он TARGET, а тепер я хочу кликнуть на DIN2 и чтобы он увеличился в длинне. (кка видите места там хватает!) Прикрепил также картинку своего констрейна на эти дорожки. Я даже такой тест сделал: Убрал все вокруг, чтобы точно убедится что места хватает, и даже пробовал толерантность % добавить, ничего эта функция не делает! Даже когда дофига места, всеравно ничего не выравнивает! в чем может быть дело? может упустил я чтото?
  9. У меня сейчас абсолютно такая же проблема! У меня стоит 16.6, и Хотфикс 007, С каким Хотфиксом у вас это получилось? С 07 или совсем новым 08? (и кстати..где достать 08? в закромах нету) Подскажите пожалуйста кто знает как решить эту проблему?
  10. Пишу с опозданием надобыло кое какие проекты сдавать и платы делать. Во первых я не заявлял что нашел глюк, тема четко говорит "проблемы с СПИ", а проблемы могут быть по разым причинам, в том числе и по причине моей ошибки. Сделал вот что: 1) После того как убедился что на новой голой плате проект СПИ заработал, я переписал старый проект по новому, и прогнал его тоже на новой плате - Заработало. 2) Старую платуполностью отсоеденил от всего что было соеденено, прогнал тот же епределанный проект - Заработало. 3) Начал присоеденять по очереди остальную перферию - Заработало с присоединенной всей периферией (Uart,PWM,I2C) 4) После того как СПИ проект с подсоединенной но не активизированной программно периферией заработал, я ее начал по очереди активизировать, в итоге проект был доведен до "оригиального" состояния, и тоже заработал под "заработал" я имею ввиду что сразу при включении не надо долго ждать и я вижу свои байты на осциллографе. Единственное что я заметил в результате всего этого это задержка SCK на примерно 1500нс когда все нижеприведенные функции не заккоментированны. Когда закомментированны две последние функции включения i2c и usart3 то задержка подтянутого SCK не более 400нс Когда закомментирован только usart3 то задержка SCk перед его переключением и посылкой байта 900нс Когда все нижеприведенные функции включены (не закомментированны) то задержка SCK перед его переключением и посылкой байта 1500нс При этом: Если включить всеэти функции (не комментировать их) и включить цикл задержки длинной после включения платы, а потом подать через тот же Usart3 команду на посылку байта по SPI, то байт отсылается сразу и SCK не задерживается (сразу начинает пиерелючатся) Вот моя последовательность включения программно периферии: config_gpio_all(); // configure all GPIOs config_pwm_io(); // configure Input and Output PWM channels config_spi_all(); // config all peripherals using SPI config_i2c_all(); // config all peripherals using I2C config_usart3(); // configure USART3 А вот код каждой функции: uint32_t config_gpio_all(void) { //============================================================================= // GPIOB configuration //============================================================================= // enable GPIOB clock RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // Alternate Function GPIOB->MODER = 0; // clear moder register GPIOB->MODER |= ( GPIO_MODER_MODER12_1 | // Alternate Function, SPI2 NSS GPIO_MODER_MODER13_1 | // Alternate Function, SPI2 SCK GPIO_MODER_MODER14_1 | // Alternate Function, SPI2 MISO GPIO_MODER_MODER15_1 | // Alternate Function, SPI2 MOSI GPIO_MODER_MODER9_1 | // Alternate Function, I2C1, SDA GPIO_MODER_MODER8_1 | // Alternate Function, I2C1, SCL GPIO_MODER_MODER4_1 | // AF, PWM_OUT1, TIM3_CH1 GPIO_MODER_MODER5_1 | // AF, PWM_OUT2, TIM3_CH2 GPIO_MODER_MODER0_1 | // AF, PWM_OUT3, TIM3_CH3 GPIO_MODER_MODER1_1 | // AF, PWM_OUT4, TIM3_CH4 GPIO_MODER_MODER6_1 | // AF, PWM_IN5, TIM4_CH1 GPIO_MODER_MODER7_1 // AF, PWM_IN6, TIM4_CH2 ); // Output type GPIOB->OTYPER = 0; // clear otype register GPIOB->OTYPER |= // push-pull if 0 ( GPIO_OTYPER_OT_8 | // Open-Drain, I2C1, SCL GPIO_OTYPER_OT_9 // OPen-Drain, I2C1, SDA ); // Speed type GPIOB->OSPEEDR = 0; // clear ospeedr register GPIOB->OSPEEDR |= ( GPIO_OSPEEDER_OSPEEDR12_1 | // SPI2 NSS 50MH GPIO_OSPEEDER_OSPEEDR13_1 | // SPI2 SCK, 50MHz GPIO_OSPEEDER_OSPEEDR14_1 | // SPI2 MISO 50MH GPIO_OSPEEDER_OSPEEDR15_1 | // SPI2 MOSI 50MH GPIO_OSPEEDER_OSPEEDR4_1 | // PWM_OUT1, TIM3_CH1, 50MHz GPIO_OSPEEDER_OSPEEDR5_1 | // PWM_OUT2, TIM3_CH2, 50MHz GPIO_OSPEEDER_OSPEEDR0_1 | // PWM_OUT3, TIM3_CH3, 50MHz GPIO_OSPEEDER_OSPEEDR1_1 | // PWM_OUT4, TIM3_CH4, 50MHz GPIO_OSPEEDER_OSPEEDR6_1 | // PWM_IN5, TIM4_CH1, 50MHz GPIO_OSPEEDER_OSPEEDR7_1 // PWM_IN6, TIM4_CH2, 50MHz ); // Push/Pull GPIOB->PUPDR = 0; // clear pupdr register GPIOB->PUPDR |= ( GPIO_PUPDR_PUPDR8_0 | // Pull-Up, I2C1, SCL GPIO_PUPDR_PUPDR9_0 | // Pull-Up, I2C1, SDA GPIO_PUPDR_PUPDR4_0 | // Pull-Up, PWM_OUT1, TIM3_CH1 GPIO_PUPDR_PUPDR5_0 | // Pull-Up, PWM_OUT2, TIM3_CH2 GPIO_PUPDR_PUPDR0_0 | // Pull-Up, PWM_OUT3, TIM3_CH3 GPIO_PUPDR_PUPDR1_0 | // Pull-Up, PWM_OUT4, TIM3_CH4 GPIO_PUPDR_PUPDR6_0 | // Pull-Up, PWM_IN5, TIM4_CH1 GPIO_PUPDR_PUPDR7_0 // Pull-Up, PWM_IN6, TIM4_CH2 ); // Alternate Function pins GPIOB->AFR[1] = 0; // clear AFR_H register GPIOB->AFR[1] |= ( (4 << ((8 - 8) << 2)) | // I2C1 SCL, AF4 (4 << ((9 - 8) << 2)) | // I2C1 SDA, AF4 (5 << ((12 - 8) << 2)) | // SPI2 NSS, AF5 (5 << ((13 - 8) << 2)) | // SPI2 SCK, AF5 (5 << ((14 - 8) << 2)) | // SPI2 MISO, AF5 (5 << ((15 - 8) << 2)) // SPI2 MOSI, AF5 ); GPIOB->AFR[0] = 0; // clear AFR_L register GPIOB->AFR[0] |= ( (2 << ((4 - 0) << 2)) | // PWM_OUT1, TIM3_CH1, AF2 (2 << ((5 - 0) << 2)) | // PWM_OUT2, TIM3_CH2, AF2 (2 << ((0 - 0) << 2)) | // PWM_OUT3, TIM3_CH3, AF2 (2 << ((1 - 0) << 2)) | // PWM_OUT4, TIM3_CH4, AF2 (2 << ((6 - 0) << 2)) | // TIM4_CH1, AF2 (2 << ((7 - 0) << 2)) // TIM4_CH2, AF2 ); //============================================================================= // GPIOD configuration //============================================================================= // enable GPIOD clock ((RCC_TypeDef *)(RCC_BASE))->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // Alternate Function ((GPIO_TypeDef *)(GPIOD_BASE))->MODER |= (GPIO_MODER_MODER9_1 | // Alternate Function, USART3_RX GPIO_MODER_MODER8_1 ); // Alternate Function, USART3_TX // Output type ((GPIO_TypeDef *)(GPIOD_BASE))->OTYPER |= 0;// push-pull if 0 //(GPIO_OTYPER_OT_8 | // Open-Drain, I2C1, SCL //GPIO_OTYPER_OT_9); // OPen-Drain, I2C1, SDA // Speed type ((GPIO_TypeDef *)(GPIOD))->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR8_1 | // USART3 TX 50 MHz GPIO_OSPEEDER_OSPEEDR9_1); // USART3 RX 50 MHz // Push/Pull for USART3 ((GPIO_TypeDef *)(GPIOD_BASE))->PUPDR |= ( GPIO_PUPDR_PUPDR8_0 | // Pull-Up, USART3 TX GPIO_PUPDR_PUPDR9_0 // Pull-Up, USART3 RX ); ((GPIO_TypeDef *)(GPIOD_BASE))->AFR[1] |= ( (7 << ((8 - 8) << 2)) | // USART3 TX, AF7 (7 << ((9 - 8) << 2)) ); // USART3 RX, AF7 return 0; } uint32_t config_pwm_io(void) { //============================================================================= // set up PWM Output on TIM3 channels //============================================================================= // enable TIM3 clock RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; // set the prescaler for 2MHz clock count // fpclk = 42MHz, TIM3_clk = 2*fpclk = 84MHz // CK_CNT = TIM3_clk / (PSC + 1) // PSC = TIM3_clk / CK_CNT - 1 TIM3->PSC = 41; // 84MHz/2MHz - 1 = 41 // set the Auto Reload Register // Needed period = (1/CK_CNT) * ARR TIM3->ARR = 30000; // PWM_period = 15ms / (1/2MHz) // clear CR2 TIM3->CR2 = 0; TIM3->CCR1 = 3000; // 10% duty cycle, for CH1 TIM3->CCR2 = 3000; // 10% duty cycle, for CH2 TIM3->CCR3 = 3000; // 10% duty cycle, for CH3 TIM3->CCR4 = 3000; // 10% duty cycle, for CH4 // set output compare mode 1. TIM3->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | // CH1 TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1; // CH2 TIM3->CCMR2 |= TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1 | // CH3 TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1; // CH4 // enable Output compare TIM3->CCER |= TIM_CCER_CC1E; //CH1 TIM3->CCER |= TIM_CCER_CC2E; //CH2 TIM3->CCER |= TIM_CCER_CC3E; //CH3 TIM3->CCER |= TIM_CCER_CC4E; //CH4 // enable TIM3 TIM3->CR1 |= TIM_CR1_CEN; return 0; } uint32_t config_spi_all(void) { //============================================================================= // SPI1 Related configuration //============================================================================= // enable SPI2 clock RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; // configure SPI2 SPI2 -> CR1 |= (SPI_CR1_SPE | SPI_CR1_CPOL | SPI_CR1_CPHA | SPI_CR1_MSTR | SPI_CR1_BR_1 | SPI_CR1_SSM | SPI_CR1_SSI); //SPI2->CR2 |= (SPI_CR2_SSOE); return 0; } uint32_t config_i2c_all(void) { //============================================================================= // I2C1 Related configuration //============================================================================= // enable I2C1 clock ((RCC_TypeDef *) (RCC_BASE))->APB1ENR |= RCC_APB1ENR_I2C1EN; // 1) configure I2C_CR2 I2C1 -> CR2 |= (I2C_CR2_FREQ_5 | I2C_CR2_FREQ_3 | I2C_CR2_FREQ_1); // APB1 clock is 42MHz // 2) Configure Clock Control Register, I2C_CCR // For 100KHz, APB1clk=42MHz, T_high = T_low = (1/42MHz)*210 = 5us // For Fast mode, T_high = 9*(1/42MHz)*CCR = 0.8us, // T_low = 16*(1/42MHz)*CCR = 1.5us, // CCR = 4, F/S = 1, DUTY = 1, I2C_CCR = 0xc004 I2C1 -> CCR = 0xc004; // 0xd2, d210 for 100KHz, // 3) Configure I2C_TRISE, Rise Time register I2C1 -> TRISE = 0x2b; // 0x2b, d42 (42 + 1) // 4) enable I2C1 peripheral I2C1 -> CR1 |= (I2C_CR1_PE); return 0; } uint32_t config_usart3(void) { //============================================================================= // USART3 Related configuration //============================================================================= // enable I2C1 clock RCC->APB1ENR |= RCC_APB1ENR_USART3EN; // 1) Setting UE, amd M bits USART3-> CR1 |= 0x2000; // UE = 1 // 2) Programming number of stop bits if needed // 3) Enable DMA if needed // 4) set the Baud Rate // BAUD = fck / ( 8 * (2 - OVER8) * USARTDIV ) // fck = 42MHz, // OVER8 = 0 // Choose BAUD = 115200 // then: USARTDIV = fck / ( 8 * (2 -OVER8) * BAUD = 22.75 // BRR = (22 << 4) | ( 0.75 * 16) = 364, // or: BRR = fck / BAUD = 42MHz / 115200 = 364 USART3->BRR = 364; // enable transmitter USART3->CR1 |= USART_CR1_TE; // enable receiver USART3->CR1 |= USART_CR1_RE; return 0; } Короче вывод такой что если сразу после включения всей периферии в приведенном коде посылать байт по SPI то буден задержкав 1500нс, но байт по любому отсылается. p.s. задача поднятия пина SS после передачи байта тоже решена программным путем. Никакие эксперименты с битами SSOE SSI SSM ни следование мануалу не привело к тому чтобыstm32 сам поднимал пин SS вверх после успешной отправки байта. (как я уже написал...после отправки читаю прием а потом уже BSY и вручную поднимаю его сам) (почти тоже самое что в теме приведенной Viko) а так вобщем работает все.
  11. Ну вобщем сейчас я поменял NSS на General Purpose Pin, и захотел чтобы этот пин был 0 во время транзакции и 1 когда нет транзакции. решил установить его в начале 1, затем перед транзакцией на 0, потом проверить биты TXE и BSY а затем опять выставить в 1. Проблема была в том, что TXE и BSY видимо выставляются почти сразу после того как сдвиговый регистр загружен, и если после этого выставлять пин на 1 то получается слишком рано, чуть ли не у начала реальной транзакции ( а не в конце). поетому поставил небольшой цикл for, чтобы отрегулировать задержку. короче, сейчас работает вобщемто так как я хочу, но ставить задержку на GPIO SS пин чтобы подогнать его так чтобы он был 0 только во время транзакции это просто уродство какоето, неужели просто нету более красивого или эффективного решения? для справки, мне надо чтобы этот SS (NSS) пин вел себя как сигнал LE вот на этой диаграмме: http://i.imgur.com/EV9flrf.jpg вот еще такое решение, проверка RXNE, чтение DR затем проверка BSY, затем уже поднять вручную пин на 1 GPIOB->ODR |= GPIO_ODR_ODR_12; //////////////// SPI2 Communication Routine /////////////////////////////////// while ( ( (SPI2 -> SR) & SPI_SR_TXE ) == RESET) { // wait until TXE bit is 1 } GPIOB->ODR &= !GPIO_ODR_ODR_12; SPI2 -> DR = d0; while ( //( ( (SPI2 -> SR) & SPI_SR_TXE ) == RESET) && (( (SPI2 -> SR) & SPI_SR_RXNE ) == RESET) ) { } dd = SPI2->DR; while ( //( ( (SPI2 -> SR) & SPI_SR_TXE ) == RESET) && (( (SPI2 -> SR) & SPI_SR_BSY ) == SET) ) { } GPIOB->ODR |= GPIO_ODR_ODR_12; так более красиво как то (не нужно циклы вставлять..)
  12. Я не пойму немного, разве целью установки SSOE=1 не является автоматическое управление пином NSS? т.е.сделать так, чтобы этот пин сам подтягивался на 0 во время транзакции и возвращался на 1 когда транзакция закончена? как можно достичь такoго поведения? И еще, вы говорите SSOE=1 и управляй пином NSS через GPIO.. но ведь пин PB12 (NSS) настроен как Alternate Function... ? (тестовыйпроект выложен в этом посте если что: http://electronix.ru/forum/index.php?showt...&p=1157091)
  13. затем что с ним не работает как надо! SSM = 0, SSOE = 1 "Попробовал этот вариант тоже. Тогда байт не передается, мне нужно вручную проводом подтянуть NSS к "1" чтобы заработало (ну и тогда естесственно NSS никогда на ноль естесственно не подтягивается стоит как 1 всегда, даже когда выключаю модуль)"
  14. Попробовал этот вариант тоже. Тогда байт не передается, мне нужно вручную проводом подтянуть NSS к "1" чтобы заработало (ну и тогда естесственно NSS никогда на ноль естесственно не подтягивается стоит как 1 всегда, даже когда выключаю модуль) Тогда вообще не работает. Простенькй проект прикрепил (работающий: SSM=1,SSI=1,SSOE=0) если хотите можете проверить.
  15. Короче,чтобы начать плностью с нуля, пошел взял новую плату Дискавери, девственную, вскрыл упаковку подключил только ноги PB13,PB14 к осциллографу. Переписал новый проект, выкинул все, оставил только SPI2 работающий на: PB12 - NSS PB13 - SCK PB14 - MISO (не использую в тесте) PB15 - MOSI Проект прикреплен к сообщению. Загружаю простой код.. и работает сразу... Не нужно теперь очень долгую задержку ставить. Новый тестовый проект скопирован из старого, только часть SPI2 и все. Значит в старом проекте проблема усугублялась тем чтоподключены и другие устройства к порту были (PWM - просто вывод напины,I2C1 - подключены 2 сенсора) Я не думаю хотя что в старой плате дискавери был дефект, т.к. тогда не рабтало бы вообще. Сорее всего проблемабыла с включением нескольких периферий на одном порту сразу, другого ничего не может быть. Вот что я отработал в новом проекте: 1) SSM=0,SSI=0 Включил, естессвтенно не сработало 2) SSM=0,SSI=0, Подтянул 1 к выводу NSS (PB12) как посоветовали. Сработало, сразу после включения вижу байт на осциллографе 3) SSM=1,SSI=1, ничего не подтянуто к NSS Сработало тоже, сразу после включения вижу байт на осциллографе Прикрепленный проект содержит конфигурацию №3 Теперь у меня вопрос по конфигурации №3: Почему после и во время того как я увидел свой байт на осциллографе NSS (PB12) ни разу не поднялся на уровень "1"? Ведь у меня же стоит SSM=1,SSI=1... Почему NSS не равен "1" на ножке PB12? Проверяю тестером и осциллографом, он всегда 0 Пробовал включать SSOE в регистре СR2 всеравно пин NSS всегда 0 Да, я вижу вы говорили про настройки ног, вот как настроены они был для порта B в старом проекте: (К данному прикрепленному тестовому проекту отношения не имеет!!, NSS и MISO были закомментированы позже) //============================================================================= // GPIOB configuration //============================================================================= // enable GPIOB clock RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // Alternate Function GPIOB->MODER = 0; // clear moder register GPIOB->MODER |= ( //GPIO_MODER_MODER12_1 | // Alternate Function, SPI2 NSS GPIO_MODER_MODER13_1 | // Alternate Function, SPI2 SCK //GPIO_MODER_MODER14_1 | // Alternate Function, SPI2 MISO GPIO_MODER_MODER15_1 | // Alternate Function, SPI2 MOSI GPIO_MODER_MODER9_1 | // Alternate Function, I2C1, SDA GPIO_MODER_MODER8_1 | // Alternate Function, I2C1, SCL GPIO_MODER_MODER4_1 | // AF, PWM_OUT1, TIM3_CH1 GPIO_MODER_MODER5_1 | // AF, PWM_OUT2, TIM3_CH2 GPIO_MODER_MODER0_1 | // AF, PWM_OUT3, TIM3_CH3 GPIO_MODER_MODER1_1 | // AF, PWM_OUT4, TIM3_CH4 GPIO_MODER_MODER6_1 | // AF, PWM_IN5, TIM4_CH1 GPIO_MODER_MODER7_1 // AF, PWM_IN6, TIM4_CH2 ); // Output type GPIOB->OTYPER = 0; // clear otype register GPIOB->OTYPER |= // push-pull if 0 ( GPIO_OTYPER_OT_8 | // Open-Drain, I2C1, SCL GPIO_OTYPER_OT_9 // OPen-Drain, I2C1, SDA ); // Speed type GPIOB->OSPEEDR = 0; // clear ospeedr register GPIOB->OSPEEDR |= ( //GPIO_OSPEEDER_OSPEEDR12_1 | // SPI2 NSS 50MH GPIO_OSPEEDER_OSPEEDR13_1 | // SPI2 SCK, 50MHz //GPIO_OSPEEDER_OSPEEDR14_1 | // SPI2 MISO 50MH GPIO_OSPEEDER_OSPEEDR15_1 | // SPI2 MOSI 50MH GPIO_OSPEEDER_OSPEEDR4_1 | // PWM_OUT1, TIM3_CH1, 50MHz GPIO_OSPEEDER_OSPEEDR5_1 | // PWM_OUT2, TIM3_CH2, 50MHz GPIO_OSPEEDER_OSPEEDR0_1 | // PWM_OUT3, TIM3_CH3, 50MHz GPIO_OSPEEDER_OSPEEDR1_1 | // PWM_OUT4, TIM3_CH4, 50MHz GPIO_OSPEEDER_OSPEEDR6_1 | // PWM_IN5, TIM4_CH1, 50MHz GPIO_OSPEEDER_OSPEEDR7_1 // PWM_IN6, TIM4_CH2, 50MHz ); // Push/Pull GPIOB->PUPDR = 0; // clear pupdr register GPIOB->PUPDR |= ( GPIO_PUPDR_PUPDR8_0 | // Pull-Up, I2C1, SCL GPIO_PUPDR_PUPDR9_0 | // Pull-Up, I2C1, SDA GPIO_PUPDR_PUPDR4_0 | // Pull-Up, PWM_OUT1, TIM3_CH1 GPIO_PUPDR_PUPDR5_0 | // Pull-Up, PWM_OUT2, TIM3_CH2 GPIO_PUPDR_PUPDR0_0 | // Pull-Up, PWM_OUT3, TIM3_CH3 GPIO_PUPDR_PUPDR1_0 | // Pull-Up, PWM_OUT4, TIM3_CH4 GPIO_PUPDR_PUPDR6_0 | // Pull-Up, PWM_IN5, TIM4_CH1 GPIO_PUPDR_PUPDR7_0 // Pull-Up, PWM_IN6, TIM4_CH2 ); // Alternate Function pins GPIOB->AFR[1] = 0; // clear AFR_H register GPIOB->AFR[1] |= ( (4 << ((8 - 8) << 2)) | // I2C1 SCL, AF4 (4 << ((9 - 8) << 2)) | // I2C1 SDA, AF4 //(5 << ((12 - 8) << 2)) | // SPI2 NSS, AF5 (5 << ((13 - 8) << 2)) | // SPI2 SCK, AF5 //(5 << ((14 - 8) << 2)) | // SPI2 MISO, AF5 (5 << ((15 - 8) << 2)) // SPI2 MOSI, AF5 ); GPIOB->AFR[0] = 0; // clear AFR_L register GPIOB->AFR[0] |= ( (2 << ((4 - 0) << 2)) | // PWM_OUT1, TIM3_CH1, AF2 (2 << ((5 - 0) << 2)) | // PWM_OUT2, TIM3_CH2, AF2 (2 << ((0 - 0) << 2)) | // PWM_OUT3, TIM3_CH3, AF2 (2 << ((1 - 0) << 2)) | // PWM_OUT4, TIM3_CH4, AF2 (2 << ((6 - 0) << 2)) | // TIM4_CH1, AF2 (2 << ((7 - 0) << 2)) // TIM4_CH2, AF2 ); test3_with_spi2_working.zip
  16. в этом посте: http://electronix.ru/forum/index.php?showt...t&p=1156458 я как раз таки хотел сказать в пункте 1), что отправка байта с УАРТ тоже не сработала! пришлось поставить непрерывный цикл, и ждать команды от того же уарта (приема от него байта команды) который прерывает цикл, а дальше код исполняет ту процедуру с отправкой байта в СПИ. Я не думаю что это так, потомучто я сделал такой тест: Подключил к осциллографу не только SCK/MOSI, но еще и NSS. И включил передачю байта разумеется в режиме в котором у меня работает нормально, т.е. байт я вижу на осциллографе.. а вот НСС всегда нулевой! Даже не дернулся во время передачи! (хотя байт сам передался как надо я ето вижу на дисплее осциллографа) хотя это странно у меня же и SSM и SSI поставлены как 1...
  17. так это и я говорил вот в этом посте, ссылаясь на даташит: http://electronix.ru/forum/index.php?showt...t&p=1156434 да нет там ничего сложного в схеме, цепляю выводи к осциллографу и все. А плата стандартная дискавери. Golikov A. за линк спасибо, пройдусь по нему тоже. Genadi Zawidowski: использование только SSM без SSI проблему тоже не решало.
  18. Его я включаю перед тем как начать работать с СПИ. Вот так: //============================================================================= // SPI2 Related configuration //============================================================================= // enable SPI2 clock ((RCC_TypeDef *) (RCC_BASE))->APB1ENR |= RCC_APB1ENR_SPI2EN; // configure SPI2 ((SPI_TypeDef *) (SPI2_BASE)) -> CR1 |= (SPI_CR1_SPE | SPI_CR1_CPOL | SPI_CR1_CPHA | SPI_CR1_MSTR | SPI_CR1_BR_1 | SPI_CR1_SSM | SPI_CR1_SSI); тоже самое делал и я после тех двух описанных мною тестов в посте №34 и №32. Согласен, Пустые умные посты типа "все происходит от недопонимания" никому не интерестны, если кто понял и знает в чем именно проблема и желает поделится, буду рад посмотреть, если нет то и постить не стоит. а это не важно, т.к. я отправляю первый байт, и ТХЕ уже заведомо имеет значение 1. Об этом я тоже писал, Вы видимо не прочли ветку и поспешили дать банальный совет.
  19. да было иначе периферия не работала бы вообще. Вот еще один интересный тест сделал(как вы говорили проверил также статус после записи), вот код (в этот раз убрал бесконечный цикл в начале): while ( (SPI2->SR & SPI_SR_TXE) ==0 ) { while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( (SPI2->SR)>>8 ); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( SPI2->SR); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set } while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( (SPI2->SR)>>8 ); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( SPI2->SR); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set SPI2->DR = d0; while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( (SPI2->SR)>>8 ); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( SPI2->SR); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set И вот некоторые наблюдения: 1) Когда я скомпилировал и зашил контроллер, то я не только не увиден на осциллографе свой байт, но я еще и не увидел байты полученные от USART3!! Интерестно нет? 2) Затем перед кодом который показан выше я добавляю фрагмент кода №2из моего предыдущего поста(непрерывный цикл с ожиданием команды от USART3), комилю, заливаю, включаю..естесственно ничего пока не происходит т.к. нет команды от USART3 на прерывание цикла, подаю команду на прерывание цикла, И вижу свой отправленныйбайт на осциллографе! А также вижу уже 4 полученных байта, и вот они: 00 02 до посылки 00 03 после посылки! Как видите интерестно то что после посылки не только TXE=1 но и RXNE=1 что говорит о том что приемник полный.. (хотя странно ничего я не принимаю..) Тем не менее... явно видно то что некоторые периферии почемуто не хотят работать почти сразу после того как чип запустился.. Ну по крайней мере такой вывод можно сделать из этих наблюдений? Если есть какие то еще идеи интерестно было бы узнать стоит просто ресет кнопка на плате, сбрасывание не помогало ничем
  20. ладно, мне кажется я частичто решил проблему. Сейчас работаю БЕЗ дебаггера, компилирую заливаю на чип включаю плату (хотя в дебаггере поведение такоеже) вот фрагмент кода №1, как уже знаете просто цикл проверки и отправка байта. while ( (SPI2->SR & SPI_SR_TXE) ==0 ) { } SPI2->DR = d0; А вот фрагмент кода №2 for(;;) { if ((USART3->SR & USART_SR_RXNE)) if (USART3->DR == 0x01) break; } Этот код просто бесконечный цикл, пока с USART3 не будет получена команда 01, как только эта команда получена цикл прерывается, и исполнение программы переходит к фрагменту кода №1 Так вот, компилю, заливаю на флеш. Затем включаю плату, естесственно ничег не происходит т.к. цикл фрагмента кода №2 работает, затем подаю команду 01 с USART3 и немедленно вижу свой байт на осциллографе! Вобщемто заработало на чипе и без дебаггера с брейк поинтами... но просто интерестно, в чем же была проблема? Выходит проблема была в том что когда я подаю питание на плату (и на чип естесственно) то толи порт вывода толи SPI2 периферия еще не успела войти в рабочий режим необходимый для отправки данных? Или чтото вроде того? Что думаете?
  21. проц нормально запускается и работает без дебаггера, т.к. я другие рабочие куски вставлял в программу перед своим тестовым кодом. вот как я считываю сейчас регистры: SR,CR1,CR2 кодом своим: while ( (SPI2->SR & SPI_SR_TXE) ==0 ); sr_t = SPI2->SR; cr1_t = SPI2->CR1; cr2_t = SPI2->CR2; // breakpoint here! SPI2->DR = 0xAA; и вот что вижу в дебаггере, все вроде нормально CR1=б1101010111 (SSM=1,SSI=1,SPE=1,BR=010,MSTR=1,CPOL=1,CPHA=1) SR=0х2 (т.е. только ТХЕ=1) CR2=0 сделал так как Вы предлагли через USART тоже. вот код: while ( (SPI2->SR & SPI_SR_TXE) ==0 ) { while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( (SPI2->SR)>>8 ); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( SPI2->SR); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set } while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( (SPI2->SR)>>8 ); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( SPI2->SR); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set SPI2->DR = d0; в USART увидел только два полученных байта: 00 02 что говорит о том что, то что внутри while цикла не выполнилось, т.к. ТХЕбыл уже равен 1 (т.е. буфер отправки данных изначально ыл свободен) А затем я получилдва байта 00 02, перед SPI2->DR = d0; как Вы и предлагали изначение 02 говорит что ТХЕ по пренему равен 1, т.е. буфер свободен. но не работает это! на осцилографе вижу подтянутый ввех SCK и нулевой MOSI есть какие идеи?
  22. Ну а что там разбиратся? у меня и SSM=1 и SSI = 1 Когда SSM=1 то програмное управление слейвом включено. в таком случае значение бита SSI передается на ногу NSS, и то что на ноге NSS извне игнорируется! иными словами этим битом можно ногой NSS управлять. в моемслучае это вообще не принципиально... т.е. с этим я разобрался и это думаю к данной проблеме не имеет отношения. Ил я не прав в чем то?
  23. попробовал добавление SPI_CR1_DFF, тоже самое, не работает если прогонять код сразу. NSS я не использую! И не используя его но исполняя код по строчкам все работает! Пытатся использовать ег сейчас думаю только усложнит проблему! Ведь ллогически, если сам интерфейс работае в дебаггере когда исполняется по строчкам.. почему он не должен работать когда разом исполняется весь код! вот в чем дело я не думаю чтоэто какое то отношение имеет к NSS. Просто я не могу понять что еще тут может быть? нет. и так не работает! И нет у меня никакого приема! все просто в тех строчках которые я привел! просто использую пины SCK и MOSI и подключаю их к осциллографу! никакого приема или ччего то еще!
×
×
  • Создать...