реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как заставить SPI работать (stm32f4Discovery), Использую стандартную библиотеку: stmperiph
BlackOps
сообщение Jun 8 2012, 04:13
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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] для длинного кода!!!


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 8 2012, 04:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Может битик SYSCFGEN в RCC_APB2ENR взвести?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 8 2012, 05:14
Сообщение #3


фанат дивана
******

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



Цитата(BlackOps @ Jun 8 2012, 10:13) *
Но в чем же причина, почему я не вижу активности на пине MOSI? (PB15)

Вы забыли включить тактирование AFIO.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 8 2012, 05:20
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(AHTOXA @ Jun 8 2012, 09:14) *
Вы забыли включить тактирование AFIO.


Для F4 это SYSCFGEN?
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jun 8 2012, 05:26
Сообщение #5


Знающий
****

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



Цитата(AHTOXA @ Jun 8 2012, 10:14) *
Вы забыли включить тактирование AFIO.

а поподробнее?

не это разве?
gpiob.GPIO_Speed = GPIO_Speed_50MHz;

указана тактовая частота, или чтото другое подразумеваете?


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 8 2012, 05:38
Сообщение #6


фанат дивана
******

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



Пардон, я не разглядел, что речь идёт о F4. Там этого нет.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jun 8 2012, 05:44
Сообщение #7


Знающий
****

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



ну тогда в чем же еще может там быть проблема?
я строго следую инструкциям описанными в самой библиотеки, ну и походу сравниваю с некоторыми другими аналогичными примерами.


и еще, тот факт что я на осциллографе вижу пин SPI2_SCK (PB13) дергается на частоте примерно 5.25МГц мне говорит о том что вроде как сам модуль SPI настроен и вроде как работает.

но вот почему данные не могу переслать в буфер? что там еще может быть?


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 8 2012, 06:06
Сообщение #8


фанат дивана
******

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



Да вроде нормально всё. Попробуйте задать spi2.SPI_Mode = SPI_NSS_Soft.

Цитата(adnega @ Jun 8 2012, 11:20) *
Для F4 это SYSCFGEN?

Не, это совсем другое. SYSCFGEN включает тактирование System configuration controller (глава 7 из RM0090).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jun 8 2012, 06:08
Сообщение #9


Знающий
****

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



попробовал. не помогло. мало того да и пин PB13 даже перестал клок подавать.


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jun 8 2012, 07:33
Сообщение #10


Знающий
****

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



что еще может быть?
может данные как то по другому надо пересылать?


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 8 2012, 07:40
Сообщение #11


фанат дивана
******

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



Данные вы отправляете правильно.
Попробуйте ещё поставить вызовы GPIO_PinAFConfig() после вызова GPIO_Init(). Мне думается, что так логичнее - сначала сконфигурировать пин, а затем подключить его к периферии.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Gunner
сообщение Jun 8 2012, 08:41
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jun 8 2012, 09:05
Сообщение #13


Знающий
****

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



т.е. сконфигурировать NSS и подать на него Vdd?


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
Gunner
сообщение Jun 8 2012, 09:23
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jun 8 2012, 09:36
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 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)
{}
}


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th July 2025 - 06:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016