|
Как заставить SPI работать (stm32f4Discovery), Использую стандартную библиотеку: stmperiph |
|
|
|
Jun 8 2012, 04:13
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
конфигурирую пины PB13 - SPI2_SCK, PB15 - SPI2_MOSI: в режиме SPI только посылаю. вот код: CODE 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)
Сообщение отредактировал IgorKossak - Jun 8 2012, 06:37
Причина редактирования: [codebox] для длинного кода!!!
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Jun 8 2012, 05:26
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
Цитата(AHTOXA @ Jun 8 2012, 10:14)  Вы забыли включить тактирование AFIO. а поподробнее? не это разве? gpiob.GPIO_Speed = GPIO_Speed_50MHz; указана тактовая частота, или чтото другое подразумеваете?
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Jun 8 2012, 08:41
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 23-06-04
Из: Kiev
Пользователь №: 146

|
QUOTE (BlackOps @ Jun 8 2012, 07:13)  конфигурирую пины 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"
Сообщение отредактировал Gunner - Jun 8 2012, 08:55
|
|
|
|
|
Jun 8 2012, 09:23
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 23-06-04
Из: Kiev
Пользователь №: 146

|
QUOTE (BlackOps @ Jun 8 2012, 12:05)  т.е. сконфигурировать NSS и подать на него Vdd? Пока подавать ничего не надо. Просто сконфигурите SPI2_NSS и командой SPI_SSOutputCmd(SPI2, ENABLE) подключите его на выход. При этом spi2.SPI_NSS = SPI_NSS_Hard. У меня в такой конфигурации все работает (STM32F207).
Сообщение отредактировал Gunner - Jun 8 2012, 09:27
|
|
|
|
|
Jun 8 2012, 09:36
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
сделал. не сработало. вот что получаю: пин MOSI поднимается сейчас вверх, и через 0.2мкс примерно опять спускается на уровень 0, а пин SCK стартует и остается на уровне Vdd. кстати, я обнаружил что в моем случае надо ставить направление в режиме spi2.SPI_Direction = SPI_Direction_2Lines_FullDuplex; в таком случае коммуникация идет по двум пинам, но т.к. я использую только отправку а не принятие, то в таком режиме я использую пин MOSI. правильно? вот обновленный код, я установил НСС как вы сказали: CODE 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) {} }
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|