|
w5100 + STM32- не корректно принимаю данные по SPI |
|
|
|
Jan 30 2013, 15:25
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
В своей программе в терминалке получаю ответ от визнета 0x12, но осциллом вижу, что визнет выдает мне число 0х13, значит я не корректно его обрабатываю. Из даташита по визнету по SPI понятно, что данные выставляются, когда sck период только начался и он еще в лог.0. Так же и на картинке осцилла. Т.е. возможные комбинации выставлены как положено. Код SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; тогда почему мой STM32 не хочет видеть число 0x13 ?   здесь D4- MISO, т.е. вход STM32 перепробовал все полярности в STM32- ничего не улучшилось. замыкал напрямую в STM32 MISO на MOSI- принимаю то, что отправляю. Если разъединяю перемычку, принимаю 0xFF, а с соединенной, именно то, что отправил. Что еще можно предпринять?
Сообщение отредактировал Метценгерштейн - Jan 30 2013, 18:35
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jan 31 2013, 13:40
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
новая вводная: замкнуты напрямую MISO на MOSI. инициализация SPI Код // SPI1 RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //Тактирование модуля SPI1 SPI1->CR1 = 0 | SPI_CR1_BR_2 | SPI_CR1_BR_0 //Baud rate = Fpclk/64 | 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 а вот, что делаю в проге Код void WIZnet_main (void) { WIZ_SPIInit(); uint8_t temp=0; uint8_t data; Delay_ms(1); for (data=0; data < 0xff; data ++) { on (TestPin); Usart1_Send_Byte_HEX (data); Usart1_Send_String ("->");
while(!(SPI1->SR & SPI_SR_TXE)) ; SPI1->DR = data; while(!(SPI1->SR & SPI_SR_RXNE)); temp = SPI1->DR; off (TestPin); Usart1_Send_Byte_HEX (temp); Usart1_Send_String ("\r\n"); } } и при этом выводится следующее: Код 00->01 01->00 02->03 03->02 04->05 05->04 06->07 07->06 08->09 09->08 0A->0B 0B->0A 0C->0D 0D->0C 0E->0F 0F->0E 10->11 11->10 12->13 13->12 14->15 15->14 16->17 17->16 18->19 19->18 ... а почему?
Сообщение отредактировал Метценгерштейн - Jan 31 2013, 16:43
|
|
|
|
|
Jan 31 2013, 16:43
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
Код void WIZ_SPIInit() { // настройка SCS вывода (GPIOB, GPIO_Pin_8) GPIOB->MODER |= GPIO_MODER_MODER8_0; //output GPIOB->OTYPER &= ~GPIO_OTYPER_OT_8; //Output push-pull GPIOB->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR8; //40 MHz GPIOB->PUPDR &=~GPIO_PUPDR_PUPDR8; //No pull-up, pull-down // настройка TestPin выхода (GPIOB, GPIO_Pin_7) GPIOB->MODER |= GPIO_MODER_MODER7_0; //output GPIOB->OTYPER &= ~GPIO_OTYPER_OT_7; //Output push-pull GPIOB->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR7; //40 MHz GPIOB->PUPDR &=~GPIO_PUPDR_PUPDR7; //No pull-up, pull-down // настрока вывода Reset (GPIOB, GPIO_Pin_5) GPIOB->MODER |= GPIO_MODER_MODER5_0; //output GPIOB->OTYPER &= ~GPIO_OTYPER_OT_5; //Output push-pull GPIOB->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR5; //40 MHz GPIOB->PUPDR &=~GPIO_PUPDR_PUPDR5; //No pull-up, pull-down // Линини SPI1 (Master) настройка SCLK, MISO и MOSI // 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; //Alternate function GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_12 | GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_5); //Push-Pull GPIOA->AFR[1] |= (5<<16 | 5<<12); //PA12 = AF5, PA11 = AF5 GPIOA->AFR[0] |= (5<<20 | 5<<16); //PA5 = AF5, PA4 = AF5
// настройка внешнего прерывания на PB3 RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI3_PB; // Connect EXTI line 3 to PB EXTI->IMR |= EXTI_IMR_MR3; // какую линию выбираем из 23-х (у нас 3-я) EXTI->FTSR |= EXTI_FTSR_TR3; // настройка фронта-среза на акт. 0 NVIC_EnableIRQ(EXTI3_IRQn); // NVIC_DisableIRQ(EXTI0_IRQn); NVIC_SetPriority(EXTI3_IRQn, 1); //приоритет // SPI1 RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //Тактирование модуля SPI1 SPI1->CR1 = 0 | SPI_CR1_BR_2 | SPI_CR1_BR_0 //Baud rate = Fpclk/64 | 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 }
|
|
|
|
|
Jan 31 2013, 18:39
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
исправил. инициализация портов Код void WIZ_SPIInit() { // настройка SCS вывода (GPIOB, GPIO_Pin_8) GPIOB->MODER |= GPIO_MODER_MODER8_0; //output GPIOB->OTYPER &= ~GPIO_OTYPER_OT_8; //Output push-pull GPIOB->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR8; //40 MHz GPIOB->PUPDR &=~GPIO_PUPDR_PUPDR8; //No pull-up, pull-down // настройка TestPin выхода (GPIOB, GPIO_Pin_7) GPIOB->MODER |= GPIO_MODER_MODER7_0; //output GPIOB->OTYPER &= ~GPIO_OTYPER_OT_7; //Output push-pull GPIOB->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR7; //40 MHz GPIOB->PUPDR &=~GPIO_PUPDR_PUPDR7; //No pull-up, pull-down // настрока вывода Reset (GPIOB, GPIO_Pin_5) GPIOB->MODER |= GPIO_MODER_MODER5_0; //output GPIOB->OTYPER &= ~GPIO_OTYPER_OT_5; //Output push-pull GPIOB->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR5; //40 MHz GPIOB->PUPDR &=~GPIO_PUPDR_PUPDR5; //No pull-up, pull-down // Линини SPI1 (Master) настройка SCLK, MISO и MOSI // PA12(MOSI), PA11(MISO), PA5(SCK), Push-Pull, AF5(SPI1) GPIOA->MODER |= GPIO_MODER_MODER12_1 | GPIO_MODER_MODER11_1 | GPIO_MODER_MODER5_1; //Alternate function GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_12 | GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_5); //Push-Pull GPIOA->AFR[1] |= (5<<16 | 5<<12); //PA12 = AF5, PA11 = AF5 GPIOA->AFR[0] |= (5<<20); //PA5 = AF5
// настройка внешнего прерывания на PB3 RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI3_PB; // Connect EXTI line 3 to PB EXTI->IMR |= EXTI_IMR_MR3; // какую линию выбираем из 23-х (у нас 3-я) EXTI->FTSR |= EXTI_FTSR_TR3; // настройка фронта-среза на акт. 0 NVIC_EnableIRQ(EXTI3_IRQn); // NVIC_DisableIRQ(EXTI0_IRQn); NVIC_SetPriority(EXTI3_IRQn, 1); //приоритет // SPI1 RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //Тактирование модуля SPI1 SPI1->CR1 = 0 | SPI_CR1_BR_2 | SPI_CR1_BR_0 //Baud rate = Fpclk/64 | 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 } сама ф-я Код void WIZnet_main (void) { WIZ_SPIInit(); uint8_t temp=0; uint8_t data; for (data=0; data < 10; data ++) { 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"); Delay_ms(20); } } и то, что вывелось Код 01->00 02->03 03->02 04->05 05->04 06->07 07->06 08->09 09->08 напомню, MISO на MOSI напрямую замкнуты
|
|
|
|
|
Feb 1 2013, 03:59
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Окей. Попробуйте ещё не полагаться на значения по умолчанию для регистров. То есть, вместо Код GPIOA->MODER |= GPIO_MODER_MODER12_1; пишите Код GPIOA->MODER &= ~GPIO_MODER_MODER12; GPIOA->MODER |= GPIO_MODER_MODER12_1; И ещё. Добавьте строчки Код SPI1->I2SCFGR &= ~SPI_I2SCFGR_I2SMOD; SPI1->CR2 = 0; _перед_ Код SPI1->CR1 = ... ЗЫ. А плата у вас случайно не F4DISCOVERY?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 1 2013, 08:15
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
попробую все проделать. плата STM32L152RBT6 такаятоже самое все. разве что у меня нет регистра SPI1->I2SCFGR &= ~SPI_I2SCFGR_I2SMOD; не обнулял его. проверяю еще идею и пойду ассемблер смотреть
Сообщение отредактировал Метценгерштейн - Feb 1 2013, 08:56
|
|
|
|
|
Feb 1 2013, 12:20
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
причесал чужой код под свой проц. в отдельном проекте. И, он работает! у меня тоже самое, тот же код, те же ф-ии, и не работает. Как так? Гляньте, кому не сложно. Может глаз замылился и не вижу очевидного? http://files.mail.ru/CA973E3E6B124F4688677F583F8C721Fэто рабочий проект вывод: Код 01->01 02->02 03->03 04->04 05->05 06->06 07->07 08->08 09->09 http://files.mail.ru/201299FB61304FBF979B8A7805554D6Fвторой проект, кот. не работает. в нем из main() я сразу иду в файл WIZnet_5100 в ф-ю WIZnet_main(); и дальше делаю все тоже самое. но результат Код JþÖ˜ffË>03 03->02 04->05 05->04 06->07 07->06 08->09 09->08 так в чем же разница? нашел причину: как только в рабочий проект добавляю к проекту файл startup_stm32l1xx_md.s из папки IAR, так сразу получаю ту же хрень. и что тут делать?
|
|
|
|
|
Feb 2 2013, 20:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
Продолжение исследования:
удаляя файл startup_stm32l1xx_md.s, я вынуждаю перейти проц на тактирование MSI 2,097 МГц. Если файлом system_stm32l1xx.c, сгенерированным прогой, задана частота 32 МГц, хоть от кварца, хоть от RC, то и получается эта хрень с выводом. Если тактирование 2,097 МГц, то все ОК.
А почему?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|