|
посоветуйте STM32 cortex M3, частота шины максимальная, SPI чтобы стабильно держал обещанные 16 МГц |
|
|
|
 |
Ответов
(1 - 52)
|
Feb 15 2013, 08:02
|
Знающий
   
Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482

|
QUOTE (Метценгерштейн @ Feb 15 2013, 12:19)  буду иметь ввиду- не знал.
а по STM32- кто с SPI работал успешно? а в чем проблема то? у меня работал stm32f105, 107, 205. частоты на память не помню, но не 2Мгц точно. точнее на 10х не мерил, неинтересно было, на 205 30Мгц при 120 тактовой - соответсвенно даташиту приведите свой код инициализациии, включая инициализацию RCC, чтоб не гадать
|
|
|
|
|
Feb 15 2013, 10:15
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37

|
Если Вы используете библиотеку CMSIS: У меня SPI в STM32F205 нормально работает. Компилю кейлом. При инициализации я использую библиотеку CMSIS. В начале работы с проектом столкнулся с несоответствием скоростей USART ожидаемым. В файле stm32f2xx.h есть строки Код #if !defined (HSE_VALUE) #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ #endif /* HSE_VALUE */ Или подправьте там или вставьте в проект глобальный дефайн, чтоб HSE_VALUE стала равняться частоте вашего кварца. Из этой константы клоки высчитываются. Цитата Программатор где-то брать надо будет купите самый дешёвый STM32___Discovery и будет Вам ST-Link.
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
|
Feb 15 2013, 10:51
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
так я и купил STM32 -Discovery плату. Код #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz*/ внешний кварц как раз 8 МГц. Там частота шины всего 32 Мгц. вот код CODE #include "stm32l1xx.h" #include "USART1.h" #include "stm32l1xx_gpio.h"
uint8_t temp, send_data = 0x01;
//Инициализация GPIO void gpio_init() { RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN; //Тактирование портов A, B //Линини SPI1 (Master) //PA12(MOSI), PA11(MISO), PA5(SCK), PA4(NSS) - AF, Push-Pull, AF5(SPI1) GPIOA->MODER |= GPIO_MODER_MODER12_1 | GPIO_MODER_MODER11_1 | GPIO_MODER_MODER5_1 | GPIO_MODER_MODER4_1; //Alternate function GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_12 | GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_5 | GPIO_OTYPER_OT_4); //Push-Pull GPIOA->AFR[1] |= (5<<16 | 5<<12); //PA12 = AF5, PA11 = AF5 GPIOA->AFR[0] |= (5<<20 | 5<<16); //PA5 = AF5, PA4 = AF5 RCC->AHBENR |= RCC_AHBENR_GPIOAEN; //настравиваем вывод порта PA8 GPIOA->MODER |= GPIO_MODER_MODER8_1; GPIOA->OTYPER &= ~GPIO_OTYPER_OT_8; GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR8; GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8; GPIOA->AFR[1] &= ~GPIO_AFRH_AFRH8; RCC->CFGR &= ~RCC_CFGR_MCOPRE; } //Инициализация SPI1, SPI2 void spi_init() { /*Настройка SPI1 (Master) 8 бит данных, MSB передается первым, программный режим управления NSS, вывод NSS (PA4) разрешено использовать в качестве выхода*/ RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //Тактирование модуля SPI1 SPI1->CR1 |= SPI_CR1_BR; //Baud rate = Fpclk/256 SPI1->CR1 &= ~SPI_CR1_CPOL; //Полярность тактового сигнала SPI1->CR1 &= ~SPI_CR1_CPHA; //Фаза тактового сигнала SPI1->CR1 &= ~SPI_CR1_DFF; //8 бит данных SPI1->CR1 &= ~SPI_CR1_LSBFIRST; //MSB передается первым SPI1->CR1 |= SPI_CR1_SSM; //Программный режим NSS SPI1->CR1 |= SPI_CR1_SSI; //Аналогично состоянию, когда на входе NSS высокий уровень SPI1->CR2 |= SPI_CR2_SSOE; //Вывод NSS - выход управления slave select SPI1->CR1 |= SPI_CR1_MSTR; //Режим Master SPI1->CR1 |= SPI_CR1_SPE; //Включаем SPI1 }
int main() { Init_USART1(); gpio_init(); //Вызов функции инициализации портов spi_init(); //Вызов функции инициализации модулей SPI RCC->CFGR |= RCC_CFGR_MCO_SYSCLK; //вывод на PA8 SYSCLK for ( uint8_t data =0; data <10; data ++) { // SPI1->DR = data; //Пишем в буфер передатчика SPI1. После этого стартует обмен данными // while(!(SPI1->SR & SPI_SR_RXNE)); //Ожидаем окончания приема данных модулем SPI1 (RXNE =1 - приемный буфер содержит данные) // temp = SPI1->DR;//Считываем данные из приемного буфера SPI1. При этой операции происходит очистка буфера и сброс флага RXNE // // Usart1_Send_Byte_HEX (temp); // Usart1_Send_String ("\r\n"); Usart1_Send_Byte_HEX (data); Usart1_Send_String ("->");
while(!(SPI1->SR & SPI_SR_TXE)) ; SPI1->DR = data; //Пишем в буфер передатчика SPI1. После этого стартует обмен данными while(!(SPI1->SR & SPI_SR_RXNE)); //Ожидаем окончания приема данных модулем SPI1 (RXNE =1 - приемный буфер содержит данные) temp = SPI1->DR;//Считываем данные из приемного буфера SPI1. При этой операции происходит очистка буфера и сброс флага RXNE Usart1_Send_Byte_HEX (temp); Usart1_Send_String ("\r\n"); } for (;;) { } } и сама тема с проблемойпока что нравится 205-й
Сообщение отредактировал Метценгерштейн - Feb 15 2013, 12:36
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Feb 16 2013, 07:16
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
STM32F207 с Атмеловской флешкой работает на 30MHz. Цитата(Метценгерштейн @ Feb 15 2013, 14:51)  так я и купил STM32 -Discovery плату. Какую именно?
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
Feb 16 2013, 09:41
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797

|
Был у нас проект как раз на L151, данные снимались с SPI-датчика и сливались в SPI-флешку. Процессор работал на своих полных 32МГц, флешка вроде бы 16, датчики медленнее, точно скорости не помню уже.. зато помню забавный момент - заменили кварц на вдвое более быстрый, а инициализацию PLL я исправить забыл  в итоге проц вполне успешно работал на частоте вдвое выше номинала. PS а вы не пробовали работать по второму SPI? их же два в этих процах.
|
|
|
|
|
Feb 16 2013, 09:56
|
Знающий
   
Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482

|
QUOTE (Метценгерштейн @ Feb 15 2013, 16:51)  CODE SPI1->CR1 |= SPI_CR1_BR; //Baud rate = Fpclk/256 } строка ни о чем не говорит? 36000000/256 = 140,625 кГц
|
|
|
|
|
Feb 17 2013, 10:31
|
Знающий
   
Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482

|
Цитата(Метценгерштейн @ Feb 17 2013, 14:45)  8 МГц- это частота PCLK2 - при ней может работать только до частоты клоков 2 МГц или ниже. Если делителем не выставлять PCLK2, то на нее идет 32 МГц- вообще не работает.
Скажите, какой код написать для проверки, что где выставить и я это проверю.
Я замыкаю МИСО на МОСИ, получаю эхо. Должно же так работать тоже. для stm32L делал давно и сейчас проверить неначем, исходники тоже на работе, появлюсь там через пару недель. для 103, 105, 107 при PCLK 32МГц все работало при делителе SPI 2 и 4. для приведенного ниже кода PCLK 36МГц Update - код из рабочего проекта на stm32f105V, соответсвенно SPICLK=18МГц. работает с AT25DF321 CODE void sFLASH_LowLevel_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;
/*!< sFLASH_SPI_CS_GPIO, sFLASH_SPI_MOSI_GPIO, sFLASH_SPI_MISO_GPIO and sFLASH_SPI_SCK_GPIO Periph clock enable */ RCC_APB2PeriphClockCmd(sFLASH_CS_GPIO_CLK | sFLASH_SPI_MOSI_GPIO_CLK | sFLASH_SPI_MISO_GPIO_CLK | sFLASH_SPI_SCK_GPIO_CLK, ENABLE); /*!< sFLASH_SPI Periph clock enable */ if (sFLASH_SPI == SPI1) RCC_APB2PeriphClockCmd(sFLASH_SPI_CLK, ENABLE); else RCC_APB1PeriphClockCmd(sFLASH_SPI_CLK, ENABLE); /*!< Configure sFLASH_SPI pins: SCK */ GPIO_InitStructure.GPIO_Pin = sFLASH_SPI_SCK_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(sFLASH_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure sFLASH_SPI pins: MOSI */ GPIO_InitStructure.GPIO_Pin = sFLASH_SPI_MOSI_PIN; GPIO_Init(sFLASH_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure sFLASH_SPI pins: MISO */ GPIO_InitStructure.GPIO_Pin = sFLASH_SPI_MISO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(sFLASH_SPI_MISO_GPIO_PORT, &GPIO_InitStructure); /*!< Configure sFLASH_CS_PIN pin: sFLASH Card CS pin */ GPIO_InitStructure.GPIO_Pin = sFLASH_CS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(sFLASH_CS_GPIO_PORT, &GPIO_InitStructure); }
unsigned char sFLASH_SendByte(unsigned char byte) { /*!< Loop while DR register in not emplty */ while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_TXE) == RESET); /*!< Send byte through the SPI1 peripheral */ SPI_I2S_SendData(sFLASH_SPI, byte); /*!< Wait to receive a byte */ while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_RXNE) == RESET); /*!< Return the byte read from the SPI bus */ return SPI_I2S_ReceiveData(sFLASH_SPI); }
void sFLASH_Init(void) { SPI_InitTypeDef SPI_InitStructure;
sFLASH_LowLevel_Init(); /*!< Deselect the FLASH: Chip Select high */ sFLASH_CS_HIGH();
/*!< SPI configuration */ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; #else SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; #endif
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(sFLASH_SPI, &SPI_InitStructure);
/*!< Enable the sFLASH_SPI */ SPI_Cmd(sFLASH_SPI, ENABLE); }
Сообщение отредактировал IgorKossak - Feb 17 2013, 11:15
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Feb 17 2013, 11:25
|
Знающий
   
Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482

|
QUOTE (Метценгерштейн @ Feb 17 2013, 17:13)  я не вижу никаких особых отличий, кроме того, что я не через структуру все сделал- плохой тон)
если замыкать МИСО на МОСИ, должен же эхо корректно получать? а не особые отличия какие? должен. осциллографом шину смотрели?
|
|
|
|
|
Feb 17 2013, 15:12
|
Знающий
   
Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482

|
QUOTE (Метценгерштейн @ Feb 17 2013, 19:58)  смотрел, конечно. Там, что тему с проблемой приводил- мне W5100 wiznet выдает число 13, а я своим STM32 не могу его прочитать. Начал копать и отрыл, что на скоростях больше 2 МБит глючит.
Отличия- что через структуру. Я и так тоже делал. в той теме не совсем понятно, поэтому спрошу 1. эхо на высоких частотах работает? 2. осциллограммы сняты, лог. анализатором, проведите еще снятые осциллографом в нормальном аналоговом режиме 3. попробуйте в 16-битном режиме поработать, я когда с ads7843 разбирался, она у меня в 8-битном тоже отказывалась нормально работать, причину чесно говоря не выяснил, да и лень было
|
|
|
|
|
Feb 18 2013, 06:56
|
Знающий
   
Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482

|
QUOTE (Метценгерштейн @ Feb 17 2013, 23:15)  да фронты не завалены были. смотрел тоже. Что именно посмотреть? а 16 бит и 8 бит режимы чем отличаются? осциллограмму SCL и MISO в аналоговом режиме. передаются 8 и 16 бит соответсвенно  в глючном режиме как отличаются принятый и переданный байты? попробуйте сделать задержку несколько тактов после выставления флага RNE - ощущение что не успеват записаться последний бит.
|
|
|
|
|
Feb 18 2013, 08:58
|

Гуру
     
Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591

|
Цитата(Метценгерштейн @ Feb 18 2013, 11:23)  потихоньку проясняется А у осц вход открыт? Может обрыв в SCK? Цитата буду пробовать на SPI2 А он же медленнее будет?
|
|
|
|
|
Feb 18 2013, 10:40
|
Знающий
   
Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482

|
QUOTE (Метценгерштейн @ Feb 18 2013, 14:23)  потихоньку проясняется  это SCK тут уже начали ошибки сыпаться. Выясняю, что еще сидит на данном пине. Пин на плате в данный момент ни к чему не подпаян. (штырек имеется ввиду) желательно посмотреть такую же осциллограмму с линией MISO на втором канале если меряете на ножке дискавери (pin20 header28 по схеме) и он не идет к вашей схеме, и там такое, тогда, 1. осциллограф - полосы пропускания достаточно? ограничение полосы отключено? режим выборки какой? 2. битый вывод проца 3. неправильная иницилизация GPIO - скорость GPIO правильно выставили? отладчиком глянтье состояние gpio на момент передачи. визуально осциллогамма выглядит, будто заряжается большая емкость или
|
|
|
|
|
Feb 18 2013, 10:59
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
инициализация портов и SPI Код RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN; //Тактирование портов A, B //Линини SPI1 (Master) //PA12(MOSI), PA11(MISO), PA5(SCK), PA4(NSS) - AF, Push-Pull, AF5(SPI1) GPIOA->MODER |= GPIO_MODER_MODER12_1 | GPIO_MODER_MODER11_1 | GPIO_MODER_MODER5_1 | GPIO_MODER_MODER4_1; //Alternate function GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_12 | GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_5 | GPIO_OTYPER_OT_4); //Push-Pull GPIOA->AFR[1] |= (5<<16 | 5<<12); //PA12 = AF5, PA11 = AF5 GPIOA->AFR[0] |= (5<<20 | 5<<16); //PA5 = AF5, PA4 = AF5
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //Тактирование модуля SPI1 SPI1->CR2 = 0; SPI1->CR1 = 0 | 0 * SPI_CR1_BR_2 | 0 * SPI_CR1_BR_1 | 0 * SPI_CR1_BR_0 //Baud rate = Fpclk/2 | 0 * SPI_CR1_CPOL //Полярность тактового сигнала | 0 * SPI_CR1_CPHA //Фаза тактового сигнала | 0 * SPI_CR1_DFF //8 бит данных | 0 * SPI_CR1_LSBFIRST //MSB передается первым | 1 * SPI_CR1_SSM //Программный режим NSS | 1 * SPI_CR1_SSI //Аналогично состоянию, когда на входе NSS высокий уровень | 1 * SPI_CR1_MSTR //Режим Master | 1 * SPI_CR1_SPE; //Включаем SPI1 ; SPI1->CR2 = SPI_CR2_SSOE; //Вывод NSS - выход управления slave select осцилл 60 МГц. Никаких фильтров не включено. Хотя, фильтр больше 20 Мег отсекает. вывод MISO замкнут на MOSI и там картина нормальная- скачут биты и уровень и фронты- все четко. если частоты клоков снизить до 2 Мгц, то еще работает, но фронты начинают валиться. А на 1 Мгц- вообще все красиво по фронтам.
Сообщение отредактировал Метценгерштейн - Feb 18 2013, 11:00
|
|
|
|
|
Feb 18 2013, 11:16
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

|
Цитата(Метценгерштейн @ Feb 18 2013, 14:59)  инициализация портов и SPI Код RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN; //Тактирование портов A, B //Линини SPI1 (Master) //PA12(MOSI), PA11(MISO), PA5(SCK), PA4(NSS) - AF, Push-Pull, AF5(SPI1) GPIOA->MODER |= GPIO_MODER_MODER12_1 | GPIO_MODER_MODER11_1 | GPIO_MODER_MODER5_1 | GPIO_MODER_MODER4_1; //Alternate function GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_12 | GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_5 | GPIO_OTYPER_OT_4); //Push-Pull GPIOA->AFR[1] |= (5<<16 | 5<<12); //PA12 = AF5, PA11 = AF5 GPIOA->AFR[0] |= (5<<20 | 5<<16); //PA5 = AF5, PA4 = AF5 ...... Однозначно у вас не настроены порты на максимальную скорость. Проверил у себя на плате. Осциллограммы совпадают в вашим скриншотом. Попробуйте установить правильные значения в регистр GPIOA->OSPEEDR. P.S. Что-то типа: Код GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR11_0 | GPIO_OSPEEDER_OSPEEDR11_1 |GPIO_OSPEEDER_OSPEEDR12_0 | GPIO_OSPEEDER_OSPEEDR12_1 |GPIO_OSPEEDER_OSPEEDR5_0 | GPIO_OSPEEDER_OSPEEDR5_1 |GPIO_OSPEEDER_OSPEEDR4_0 | GPIO_OSPEEDER_OSPEEDR4_1;
|
|
|
|
|
Feb 18 2013, 11:47
|
Знающий
   
Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482

|
QUOTE (Метценгерштейн @ Feb 18 2013, 16:59)  инициализация портов и SPI [code] RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN; //Тактирование портов A, B //Линини SPI1 (Master) //PA12(MOSI), PA11(MISO), PA5(SCK), PA4(NSS) - AF, Push-Pull, AF5(SPI1) GPIOA->MODER |= GPIO_MODER_MODER12_1 | GPIO_MODER_MODER11_1 | GPIO_MODER_MODER5_1 | GPIO_MODER_MODER4_1; //Alternate function GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_12 | GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_5 | GPIO_OTYPER_OT_4); //Push-Pull GPIOA->AFR[1] |= (5<<16 | 5<<12); //PA12 = AF5, PA11 = AF5 GPIOA->AFR[0] |= (5<<20 | 5<<16); //PA5 = AF5, PA4 = AF5 я не знаю как регисты в иаре выглядят, надо установить GPIOA_OSPEEDR5 = 3;
|
|
|
|
|
Feb 18 2013, 11:58
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
щуп осцилла 1:10 пробую порты да! все четко! Фронты в норме. Код GPIOA->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR5 | GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR12; //ноги 40 МГц а все 3 ноги надо 40 МГц выставить? MOSI MISO SCK ? или вход не надо? Как-то упустил совсем из виду это. Спасибо всем)
Сообщение отредактировал Метценгерштейн - Feb 18 2013, 11:59
|
|
|
|
|
Feb 18 2013, 12:32
|
Знающий
   
Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482

|
QUOTE (Метценгерштейн @ Feb 18 2013, 17:58)  а все 3 ноги надо 40 МГц выставить? MOSI MISO SCK ? или вход не надо?
Как-то упустил совсем из виду это. Спасибо всем) вход не надо, а MOSI и CS тоже надо так вроде уже писали про это, и в примерах приведенных было. и еще, если отдельную плату будете разводить, желательно последовательные резисторы 33-51Ом, чтоб звона не было и подтяжки 100кОм
|
|
|
|
|
Feb 18 2013, 12:54
|
Знающий
   
Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482

|
QUOTE (Метценгерштейн @ Feb 18 2013, 18:38)  а не будет из-за последоват. резисторов RC цепь на частотах? Для чего они? А подтяжки зачем? Програмных не достаточно? как раз и надо RC-фильтр чтоб звон погасить, мешать не будет, такие даже на DDR 400МГц стоят. а вот избежать трудноуловимых глюков помогут. подтяжки чтоб пока контроллер не загрузился (программные еще не включены), помехи чего попало куда попало не записали. как минимум на CS - обязательно, остальные по желанию. а если SD-карта на SPI, то строго обязательно - это культовое место посещения граблей
|
|
|
|
|
Feb 18 2013, 16:23
|
Знающий
   
Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482

|
QUOTE (Golikov A. @ Feb 18 2013, 21:35)  забавно... на 1 странице была ссылка на тему с той же проблемой, и в ней я написал что возможно надо настроить порты на макс частоту, но я не был уверен что эта настройка влияет на СПИ. Сам так нагорел, когда пытался системный клок наружу выдать... Что-то упустил что тут тоже стоило бы написать, сорки, думал за той темой следят... ТС невнимательно ответы читает, я Ваше сообщение в той теме видел, поэтому сразу не стал на этом внимание акцентировать, думал уже проверено
|
|
|
|
|
Feb 19 2013, 16:00
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Просто для информации: Программный SPI на STM32F405 REV_A и REV_Z (не спрашивайте почему программный, на то были причины, суть не в этом). Код: CODE #define ADDR_L ADDR_PORT->BSRRH = ADDR_PIN #define ADDR_H ADDR_PORT->BSRRL = ADDR_PIN // #define SDA_L SDA_PORT->BSRRH = SDA_PIN #define SDA_H SDA_PORT->BSRRL = SDA_PIN // #define SCL_L SCL_PORT->BSRRH = SCL_PIN #define SCL_H SCL_PORT->BSRRL = SCL_PIN // #define CS_L CS_PORT->BSRRH = CS_PIN #define CS_H CS_PORT->BSRRL = CS_PIN //------------------------------------------------- static __INLINE void SendByte(u8 c){ if(c &0x80) SDA_H; else SDA_L; SCL_H; if(c &0x40) SDA_H; else SDA_L; SCL_L; SCL_H; if(c &0x20) SDA_H; else SDA_L; SCL_L; SCL_H; if(c &0x10) SDA_H; else SDA_L; SCL_L; SCL_H; if(c &0x08) SDA_H; else SDA_L; SCL_L; SCL_H; if(c &0x04) SDA_H; else SDA_L; SCL_L; SCL_H; if(c &0x02) SDA_H; else SDA_L; SCL_L; SCL_H; if(c &0x01) SDA_H; else SDA_L; SCL_L; SCL_H; SCL_L; } //--------------------------------------- void Write_REG(u8 c){ CS_L; ADDR_L; SendByte©; CS_H; } Результат длительности CS (по осциллографу) в различных условиях: // ~1,3uS w/o OPT for 'A' // ~1,0uS w/o OPT for 'Z' // ~0.85uS with OPT Level 3 + Otp to Time for 'A' // ~0.6uS with OPT Level 3 + Otp to Time for 'Z'
Сообщение отредактировал IgorKossak - Feb 19 2013, 16:39
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|