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

 
 
 
Reply to this topicStart new topic
> STM32F4 странности с SPI
Vichkins
сообщение Jul 13 2012, 17:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 11-02-09
Пользователь №: 44 714



Пытаюсь наладить обмен данными с трансивером RFM22B, проц stm32f405
до этого работал с spi на f417 таких проблем не было
вот код чтения регистра модуля
CODE

RFM22_SS(ENABLE);
while(!(SPI3->SR&SPI_I2S_FLAG_TXE));
SPI3->DR=reg&(~RFM22_SPI_WRITE_MASK);
while(!(SPI3->SR&SPI_I2S_FLAG_TXE));
SPI3->DR=0x00;
while(!(SPI3->SR&SPI_I2S_FLAG_TXE));
RFM22_SS(DISABLE);

return SPI3->DR;

весь прикол в том, что этот код не работает без отладчика или если поставить брейкпоинт в конце кода, в регистре DR ноль, а если прошагать этот код отладчиком то всё окей wacko.gif
перекидывал модуль на плату с stm32f100 та же фигня, только там вообще непонятно что иногда в регистр приходит, пробовал на трёх SPI на разных пинах контроллера
вместо проверки флага TXE ставил задержки, менял скорость SPI, пробовал запаивать новый модуль, ничего не помогает help.gif
единственное, что ещё приходит на ум, читать SPI с помощью DMA
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 13 2012, 17:43
Сообщение #2


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

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



При отправке байта ждать надо не TXE, а RXNE. TXE взводится сразу после опустошения передатчика, передача в это время ещё вовсю идёт.
Получается, что в конце посылки вы сбрасываете чипселект до её окончания.
Если уж быть совсем точным, то и RXNE может взвестись раньше, чем окончится передача, в зависимости от режима SPI. Так что перед отключением чипселекта желательно сделать небольшую паузу.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Vichkins
сообщение Jul 13 2012, 18:10
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 11-02-09
Пользователь №: 44 714



забыл написать, RXNE тоже пробовал проверять, то же самое
паузы в функции чипселекта стоят перед и после отключения по 500 мкс.
Go to the top of the page
 
+Quote Post
rx9cim
сообщение Jul 15 2012, 17:49
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 2-07-12
Пользователь №: 72 593



есть еще бит BSY - окончание транзакции. яяяяесли работаете в режиме фулл-дуплекс, то первый байт у вас будет пустой либо мусор.
Go to the top of the page
 
+Quote Post
Vichkins
сообщение Jul 16 2012, 13:48
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 11-02-09
Пользователь №: 44 714



уже решил проблему переключением SPI в 16 битный режим
но вылезла другая пролбема
перекидываю код I2C slave с f100 на f405
код инициализации
CODE

GPIO_PinAFConfig(GPIOB, GPIO_Pin_10, GPIO_AF_I2C2);
GPIO_PinAFConfig(GPIOB, GPIO_Pin_11, GPIO_AF_I2C2);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// I2C init
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9;
I2C_InitStructure.I2C_OwnAddress1 = I2C_SLAVE_ADDR;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

I2C_DeInit(I2C2);
I2C_Init(I2C2, &I2C_InitStructure);
I2C_ITConfig(I2C2, I2C_IT_EVT, ENABLE);
I2C_ITConfig(I2C2, I2C_IT_BUF, ENABLE);
I2C_ITConfig(I2C2, I2C_IT_ERR, ENABLE);
I2C_Cmd(I2C2, ENABLE);

проблема в том что после строчки GPIO_Init(GPIOB, &GPIO_InitStructure); обе линии в нуле, висит флаг BSY, и соответственно вся шина валится, на f100 всё ок было wacko.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:42
Рейтинг@Mail.ru


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