Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4 странности с SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Vichkins
Пытаюсь наладить обмен данными с трансивером 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
AHTOXA
При отправке байта ждать надо не TXE, а RXNE. TXE взводится сразу после опустошения передатчика, передача в это время ещё вовсю идёт.
Получается, что в конце посылки вы сбрасываете чипселект до её окончания.
Если уж быть совсем точным, то и RXNE может взвестись раньше, чем окончится передача, в зависимости от режима SPI. Так что перед отключением чипселекта желательно сделать небольшую паузу.
Vichkins
забыл написать, RXNE тоже пробовал проверять, то же самое
паузы в функции чипселекта стоят перед и после отключения по 500 мкс.
rx9cim
есть еще бит BSY - окончание транзакции. яяяяесли работаете в режиме фулл-дуплекс, то первый байт у вас будет пустой либо мусор.
Vichkins
уже решил проблему переключением 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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.