BlackOps 0 8 июня, 2012 Опубликовано 8 июня, 2012 (изменено) · Жалоба конфигурирую пины PB13 - SPI2_SCK, PB15 - SPI2_MOSI: в режиме SPI только посылаю. вот код: int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f4xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f4xx.c file */ uint8_t d0 = 0xd9; // 11011001, test data0 // declare SPI init data structure SPI_InitTypeDef spi2; // declare GPIO init data structure GPIO_InitTypeDef gpiob; // enable SPI2 clock RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); // enable SPI2 pins RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // connecting Alternate Functions to GPIOB pins GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); // GPIOB configuration gpiob.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15; gpiob.GPIO_Mode = GPIO_Mode_AF; gpiob.GPIO_OType = GPIO_OType_PP; gpiob.GPIO_Speed = GPIO_Speed_50MHz; gpiob.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &gpiob); // initializing the SPI2 SPI_I2S_DeInit(SPI2); spi2.SPI_Direction = SPI_Direction_1Line_Tx; spi2.SPI_DataSize = SPI_DataSize_8b; spi2.SPI_CPOL = SPI_CPOL_High; spi2.SPI_CPHA = SPI_CPHA_1Edge; spi2.SPI_FirstBit = SPI_FirstBit_LSB; spi2.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; spi2.SPI_Mode = SPI_Mode_Master; SPI_Init(SPI2, &spi2); // enable the SPI2 SPI_Cmd(SPI2, ENABLE); // sending the data while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI2, (uint8_t)d0); while (1) {} } проблема такая, когда проверяю ножку пина PB15, то вижу клок в 5.25МГц, что вобщемто и должно быть т.к. я прескалер поставил _8. Но на ножке PB15, с момента запуска платы никаких данных не постыпает. SPIМне кажется сам модуль SPI вроде как сконфигурирован, но какая то проблема с посыланием данных, я сам взял это с какого то примера. Сам код отвечающий за посылку данных выделен. // sending the data while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI2, (uint8_t)d0); я просто жду пока Тх буффер будет свободен, и заливаю туда байт. Но в чем же причина, почему я не вижу активности на пине MOSI? (PB15) Изменено 8 июня, 2012 пользователем IgorKossak [codebox] для длинного кода!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Может битик SYSCFGEN в RCC_APB2ENR взвести? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Но в чем же причина, почему я не вижу активности на пине MOSI? (PB15) Вы забыли включить тактирование AFIO. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Вы забыли включить тактирование AFIO. Для F4 это SYSCFGEN? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackOps 0 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Вы забыли включить тактирование AFIO. а поподробнее? не это разве? gpiob.GPIO_Speed = GPIO_Speed_50MHz; указана тактовая частота, или чтото другое подразумеваете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Пардон, я не разглядел, что речь идёт о F4. Там этого нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackOps 0 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба ну тогда в чем же еще может там быть проблема? я строго следую инструкциям описанными в самой библиотеки, ну и походу сравниваю с некоторыми другими аналогичными примерами. и еще, тот факт что я на осциллографе вижу пин SPI2_SCK (PB13) дергается на частоте примерно 5.25МГц мне говорит о том что вроде как сам модуль SPI настроен и вроде как работает. но вот почему данные не могу переслать в буфер? что там еще может быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Да вроде нормально всё. Попробуйте задать spi2.SPI_Mode = SPI_NSS_Soft. Для F4 это SYSCFGEN? Не, это совсем другое. SYSCFGEN включает тактирование System configuration controller (глава 7 из RM0090). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackOps 0 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба попробовал. не помогло. мало того да и пин PB13 даже перестал клок подавать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackOps 0 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба что еще может быть? может данные как то по другому надо пересылать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Данные вы отправляете правильно. Попробуйте ещё поставить вызовы GPIO_PinAFConfig() после вызова GPIO_Init(). Мне думается, что так логичнее - сначала сконфигурировать пин, а затем подключить его к периферии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gunner 0 8 июня, 2012 Опубликовано 8 июня, 2012 (изменено) · Жалоба конфигурирую пины PB13 - SPI2_SCK, PB15 - SPI2_MOSI: в режиме SPI только посылаю. Попробуйте еще сконфигурировать пин SPI2_NSS и после SPI_Init() поставить SPI_SSOutputCmd(SPI2, ENABLE). "When configured in master mode with NSS configured as an input (MSTR=1 and SSOE=0) and if NSS is pulled low, the SPI enters the master mode fault state: the MSTR bit is automatically cleared and the device is configured in slave mode" Изменено 8 июня, 2012 пользователем Gunner Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackOps 0 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба т.е. сконфигурировать NSS и подать на него Vdd? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gunner 0 8 июня, 2012 Опубликовано 8 июня, 2012 (изменено) · Жалоба т.е. сконфигурировать NSS и подать на него Vdd? Пока подавать ничего не надо. Просто сконфигурите SPI2_NSS и командой SPI_SSOutputCmd(SPI2, ENABLE) подключите его на выход. При этом spi2.SPI_NSS = SPI_NSS_Hard. У меня в такой конфигурации все работает (STM32F207). Изменено 8 июня, 2012 пользователем Gunner Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackOps 0 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба сделал. не сработало. вот что получаю: пин MOSI поднимается сейчас вверх, и через 0.2мкс примерно опять спускается на уровень 0, а пин SCK стартует и остается на уровне Vdd. кстати, я обнаружил что в моем случае надо ставить направление в режиме spi2.SPI_Direction = SPI_Direction_2Lines_FullDuplex; в таком случае коммуникация идет по двум пинам, но т.к. я использую только отправку а не принятие, то в таком режиме я использую пин MOSI. правильно? вот обновленный код, я установил НСС как вы сказали: int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f4xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f4xx.c file */ uint8_t d0 = 0xd9; // 11011001, test data0 // declare SPI init data structure SPI_InitTypeDef spi2; // declare GPIO init data structure GPIO_InitTypeDef gpiob; // enable SPI2 clock RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); // enable SPI2 pins RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // GPIOB configuration gpiob.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15 | GPIO_Pin_12; gpiob.GPIO_Mode = GPIO_Mode_AF; gpiob.GPIO_OType = GPIO_OType_PP; gpiob.GPIO_Speed = GPIO_Speed_50MHz; gpiob.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &gpiob); // connecting Alternate Functions to GPIOB pins GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); // initializing the SPI2 SPI_I2S_DeInit(SPI2); spi2.SPI_Direction = SPI_Direction_2Lines_FullDuplex; spi2.SPI_DataSize = SPI_DataSize_8b; spi2.SPI_CPOL = SPI_CPOL_High; spi2.SPI_CPHA = SPI_CPHA_1Edge; spi2.SPI_FirstBit = SPI_FirstBit_LSB; spi2.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; spi2.SPI_Mode = SPI_Mode_Master; spi2.SPI_NSS = SPI_NSS_Hard; SPI_Init(SPI2, &spi2); SPI_SSOutputCmd(SPI2, ENABLE); // enable the SPI2 SPI_Cmd(SPI2, ENABLE); // sending the data while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) { } SPI_I2S_SendData(SPI2, (uint8_t)d0); // make sure the transmit buffer is free // while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); // SPI_I2S_SendData(SPI2, d0); // we are not reading data so be sure that the character goes to the shift register //while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); // and then be sure it has been sent over the wire // while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET); while (1) {} } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться