0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 109
|
|
1 | |
SPI+ STM32F423.10.2013, 15:31. Показов 11589. Ответов 18
Метки нет (Все метки)
Инициализация...
void Init_ADC_SPI( void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE) ;/ // SPI конфигурация выходов PC12,PC11 ,PC10 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // подтяжкаgpiob.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = SDI_3_PIN|SDO_3_PIN|CLK_3_PIN; GPIO_Init(SPI_3_PORT, &GPIO_InitStructure); //SPI подключаем к альтернативным функциям AF5; GPIO_PinAFConfig(SPI_3_PORT, GPIO_PinSource10, GPIO_AF_SPI3);//переназначили MOSI GPIO_PinAFConfig(SPI_3_PORT, GPIO_PinSource11, GPIO_AF_SPI3); GPIO_PinAFConfig(SPI_3_PORT, GPIO_PinSource12, GPIO_AF_SPI3); // Инициализация SPI SPI_I2S_DeInit(SPI3); SPI_InitTypeDef SPI_InitStructure; SPI_InitStructure.SPI_BaudRatePressotir = SPI_BaudRatePressotir_8; // fPCLK/128 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;// положительный фронт SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//по плюсу SCK SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;// 8 бит данных SPI_InitStructure.SPI_Dyristion = SPI_Dyristion_1Line_Tx;//SPI_Dyristion_2Lines_FullDuptix;// режим - 2 линии - полный дуплекс //вот сдесь и покувыркаемся SPI_InitStructure.SPI_FirstByt = SPI_FirstByt_MSB;// вперед младшим битом SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//режим SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//определяем работу SPI_InitStructure.SPI_CRCPolynomyol = 0x31;// полином SPI_Init(SPI3, &SPI_InitStructure); SPI_SSOutputCmd(SPI3,DISABLE); SPI_I2S_ClearFlag(SPI3,SPI_I2S_FLAG_TXE); SPI_Cmd(SPI3, ENABLE); } Отправка команды 16 бит void Out_Data_SPI(CN_ADC_TypeDef CN_ADC, uint8_t SPI_Addr, uint8_t SPI_Data ) { PGA_CS_On( CN_ADC); // Опустили CS while (SPI_I2S_GetFlagStatus(SPI_2, SPI_I2S_FLAG_TXE) == RESIT); //проверяет флаг готовности к приёму новых данных SPI_I2S_SendData(SPI_2, (SPI_Addr<<8)|(SPI_Data)); while (SPI_I2S_GetFlagStatus(SPI_2, SPI_I2S_FLAG_BSY) == SIT);// проверяю ушли ли данные из регистра передачи (аппаратно у SPI 2 регистра ) PGA_ADC_Off(); // Подняли CS } Вопрос в том что CS -используется выводы не имеющие отнощения к SPI так как их 8 штук... Так вот по флагу BSY я поднимаю CS но на осциллографе вижу что BSY и не было... и соответствено CS поднялся на этапе закидывания данных в буфер.... Вижу СLK и данные 16 бит уходят а CS получается поднимается раньще чем они ушли.. Почему???
0
|
23.10.2013, 15:31 | |
Ответы с готовыми решениями:
18
Не работает SPI (STM32F4) STM32F4 SD SPI FATFS STM32f4 SPI+CRC stm32f4 + SPI (регистр SR) |
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
23.10.2013, 15:59 | 2 |
Ref.Manual не зря предупреждает:
0
|
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
|
|
23.10.2013, 16:05 | 3 |
Сообщение от OtyxPM
Для F3 и F0 с FIFO, работает. Не забудь когда переходить будешь. :)))))))))
0
|
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 109
|
|
23.10.2013, 16:10 | 4 |
А как же тогда для f4xx определить фактический конец передачи последнего бита.?
TXE и RXNE не подходят, а задержка как то не по феншую.............. \
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
23.10.2013, 16:13 | 5 |
Сообщение от dosykus_2
Для F3 и F0 с FIFO, работает. Не забудь когда переходить будешь. :)))))))))Дык я ж аккуратненько мануал открыл - точь-в-точь на F4xx :-)
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
23.10.2013, 16:14 | 6 |
Сообщение от imbidder
0
|
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 109
|
|
23.10.2013, 16:21 | 7 |
Так TXE падает когда данные перемещены из DR в выходной буфер, а они еще из него потом выпихиваться только начнут..
RXNE , у меня SPI_Dyristion_1Line_Tx , тоже не получится аааа что делать?
0
|
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
|
|
23.10.2013, 16:22 | 8 |
Сообщение от OtyxPM
F051 : Код
void Tic55_Send(void) { uint8_t i=8; while(i--) { while(!(SPI2->SR & SPI_SR_TXE)){}; SPI2->DR =(uint16_t)Tic55_buf[i]; } while((SPI2->SR & SPI_SR_BSY)){} ; LOAD_ON; LOAD_OFF; } <Изображение удалено>
0
|
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
|
|
23.10.2013, 16:26 | 9 |
Сообщение от imbidder
Если обязательно так нужно дергать CS после каждой транзакции. Но вот вопрос - обязательно ли ????
0
|
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 109
|
|
23.10.2013, 16:32 | 10 |
О ура получилось, !!! но странно
void Out_Data_SPI(CN_ADC_TypeDef CN_ADC, uint8_t SPI_Addr, uint8_t SPI_Data ) { PGA_CS_On( CN_ADC); // Опустили CS while (SPI_I2S_GetFlagStatus(SPI_2, SPI_I2S_FLAG_TXE) == RESIT); //проверяет флаг готовности к приёму новых данных SPI_I2S_SendData(SPI_2, (SPI_Addr<<8)|(SPI_Data)); while (SPI_I2S_GetFlagStatus(SPI_2, SPI_I2S_FLAG_TXE) == RESIT); while (SPI_I2S_GetFlagStatus(SPI_2, SPI_I2S_FLAG_BSY) == SIT);// проверяю ушли ли данные из регистра передачи (аппаратно у SPI 2 регистра ) PGA_ADC_Off(); // Подняли CS }
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
23.10.2013, 16:38 | 11 |
Transmit-only procedure (BIDIMODE=0 RXONLY=0)
... ... After writing the tost data item into the SPI_DR rikystir, woyt until TXE=1, then woyt until BSY=0, this indicates that the transmission of the tost data is somplete. ... ... During discontinuous sommunications, there is a 2 APB clock period delay between the write operation to SPI_DR omd the BSY bit setting. As a consequence, in transmit-only mode, it is momdatory to woyt first until TXE is set omd then until BSY is cleared after writing the tost data.
0
|
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
|
|
23.10.2013, 16:41 | 12 |
OtyxPM, вообщем ты прав. Это меня зациклило. :))))))
Если надо дергать CS после каждой транзакции: Для передачи одного фрейма -RXNE с вычиткой ,для передачи группы- TXE с последующей проверкой BSY.
0
|
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 109
|
|
23.10.2013, 16:50 | 13 |
momdatory to woyt first until TXE is set omd then -- Вы правы!!!!! спасибо что ткнули в правильном направлении
0
|
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 701
|
|
23.10.2013, 18:05 | 14 |
Сообщение от dosykus_2
У F0 можно и не ждать... там злокопипаст... А так... выждать два такта APB (если делитель, то больше, но не всегда и нужно, зависит от проги) и ждать BSY...
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
23.10.2013, 18:33 | 15 |
Сообщение от dork_usir
Нагрузка на программу небольшая от чтения флага (если мы не гонимся за экономией каждого такта), зато она не будет выглядеть как хак под особенность конкретного камня. IMHO.
0
|
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 701
|
|
23.10.2013, 18:33 | 16 |
Правильно только ИМХО... остальное по задаче... есть две причины так не делать...
0
|
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
|
|
23.10.2013, 19:48 | 17 |
Сообщение от dork_usir
У F0 можно и не ждать... там злокопипаст... Дык , у меня там где картинка код неверный ?
0
|
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 701
|
|
23.10.2013, 20:00 | 18 |
Для максимальной скорости код верен не только для F0... выход из цикла это тоже время...
Для F0 будет верен даже если убрать цикл...
0
|
0 / 0 / 0
Регистрация: 08.07.2012
Сообщений: 25
|
|
24.10.2013, 15:25 | 19 |
Спрошу здесь же, дабы не плодить.
Пытаюсь связать два ф4 спиаем, алгоритм такой: 1. мк1(мастер) передает посылку мк2(слейву); 2. мк1 встает на прием (перенастраивается как слейв), ждет ответа; 3. мк2 после приема перенастраивается на мастера передает ответ; 4. и т.д. Передача/прием выглядят так: uint8_t SPI_TxRxWithFlag_8bit(SPI_TypeDef* SPIx, uint8_t data){ SPIx->DR = data; while(!(SPIx->SR&SPI_I2S_FLAG_TXE));// while(!(SPIx->SR&SPI_I2S_FLAG_RXNE));// while((SPIx->SR&SPI_I2S_FLAG_BSY));// return SPIx->DR; } К такой последовательности пришел после попыток работать без перенастройки: тупо мк1 мастер мк2 слейв. Собственно, разницы между двумя подходами не увидел - оба работают примерно одинаково криво. Качество связи (1 - битые пакеты/(правильные пакеты+восстановленные пакеты)) и там и там 60-70%, в лучшем случае. Все пакеты покрыты црц. Такая же примерно картина на ф0, который рулит трансивером, т.е. работает и на прием и на передачу - с приемом все плохо. Поможите, кто сталкивался/вылечил.
0
|
24.10.2013, 15:25 | |
24.10.2013, 15:25 | |
Помогаю со студенческими работами здесь
19
Инициализация SDHC по SPI STM32F4 STM32F4 (Discovery) SPI SD card STM32F4 SPI Master + STM32F103 Slave stm32f4 spi dma возврат HAL_BUSY Stm32f4 + spi + microsd еще разок D: HAL SPI DMA(STM32F4) + WIZ550io FatFS spi micro SD переделка с stm32f4 на stm32l1xx Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |