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

 
 
> Проблема с SPI., STM32F303VC
Jenya7
сообщение Mar 27 2018, 06:53
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Камень STM32F303VC
Настроил SPI
Код
/*!< SPI Config */
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;  //APB1=36Mhz => ~1Mhz //APB2=72Mhz                                                                  
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPIx, &SPI_InitStructure);

Размер задан - байт - SPI_DataSize_8b
На скопе на клоке вижу 16 бит - после передачи 8 бит посылает еще 8.
Я что то недонастроил?

Передача байта такая
Код
uint32_t SPI_TransferByte(SPI_TypeDef *SPIx, uint8_t data)
{
    uint32_t timeout;

    // All data transmitted/received but SPI may be busy so wait until done.
    timeout = SPI_DELAY;
    while (SPIx->SR & SPI_I2S_FLAG_BSY) { if(!timeout--) return SPI_ERR; }

    // Setting the Data Register (DR) transmits the byte of data on MOSI.
    SPIx->DR = data;

    //  Wait for any data on MISO pin to be received.
    timeout = SPI_DELAY;
    while (!(SPIx->SR & SPI_I2S_FLAG_RXNE)) { if(!timeout--) return SPI_ERR; }

    //  Return the data received on MISO pin.
    return (uint8_t)(SPIx->DR);
}


Сообщение отредактировал Jenya7 - Mar 27 2018, 06:56
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 17)
jcxz
сообщение Mar 30 2018, 08:47
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Obam @ Mar 28 2018, 18:18) *
Символические имена, соответствующие даташиту или рефману, вместо "просто номеров битов" будут более красивы и существенно эффективны.

Ну да, ну да. Как же. Всё в мире относительно.
Вот например набор символических имён только для одного из регистров USIC в XMC4xxx:
CODE
#define USIC_CH_RBCTR_DPTR_Pos
#define USIC_CH_RBCTR_DPTR_Msk
#define USIC_CH_RBCTR_LIMIT_Pos
#define USIC_CH_RBCTR_LIMIT_Msk
#define USIC_CH_RBCTR_SRBTM_Pos
#define USIC_CH_RBCTR_SRBTM_Msk
#define USIC_CH_RBCTR_SRBTEN_Pos
#define USIC_CH_RBCTR_SRBTEN_Msk
#define USIC_CH_RBCTR_SRBINP_Pos
#define USIC_CH_RBCTR_SRBINP_Msk
#define USIC_CH_RBCTR_ARBINP_Pos
#define USIC_CH_RBCTR_ARBINP_Msk
#define USIC_CH_RBCTR_RCIM_Pos
#define USIC_CH_RBCTR_RCIM_Msk
#define USIC_CH_RBCTR_SIZE_Pos
#define USIC_CH_RBCTR_SIZE_Msk
#define USIC_CH_RBCTR_RNM_Pos
#define USIC_CH_RBCTR_RNM_Msk
#define USIC_CH_RBCTR_LOF_Pos
#define USIC_CH_RBCTR_LOF_Msk
#define USIC_CH_RBCTR_ARBIEN_Pos
#define USIC_CH_RBCTR_ARBIEN_Msk
#define USIC_CH_RBCTR_SRBIEN_Pos
#define USIC_CH_RBCTR_SRBIEN_Msk
#define USIC_CH_RBCTR_RBERIEN_Pos
#define USIC_CH_RBCTR_RBERIEN_Msk

Теперь представьте, что для того чтобы сконфигурить этот самый USIC в режиме UART надо записать значения в пару десятков его регистров.
И для каждого - подобная портянка.
С "символическими именами" портянка получается очень даже зубодробительная - чёрт ногу сломит в таких портянках.
И какой смысл от неё? Если битов десяток - то ещё можно запомнить, что значит каждое из этих имён, но когда в этой периферии регистров - несколько десятков, да в каждом - до 32 конфигурационных битов - один фиг без pdf перед глазами не вспомнить их назначение. А по мануалу гораздо удобнее искать по номерам битов чем по этим зубодробительным именам.
Лучше уж я напишу:
Код
      io->RBCTR = ch + UART_FIFO_TX_SIZE |
      UART_FIFO_RX_SIZE / 2 - 1 << 8 | (srTxRxErr & 7 << 3) << 16 - 3 |
      srTxRxErr >> 6 << 19 | 3 << 22 |
      concat(USIC_FIFO_SIZE_, UART_FIFO_RX_SIZE) << 24 |
      B15 | B28 | B30 | B31;
А когда надо что-то поменять - всё равно залезу в мануал.
PS: Так что не надо всё мерить по STM32 с его скудной периферией в 2-3 регистра. laughing.gif
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 30 2018, 14:55
Сообщение #17


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Хозян, как всем известно - барин...
да и речь в топике велась об "STM32 с его скудной периферией в 2-3 регистра."

Цитата
На Cortex-M3 не выровненные данные не приводят к HF...

В командах STM/LDM не выровненные на границу слова данные ещё как приводят.

Сообщение отредактировал Obam - Mar 30 2018, 15:00


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 30 2018, 19:43
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Obam @ Mar 30 2018, 17:55) *
В командах STM/LDM не выровненные на границу слова данные ещё как приводят.

и не только в них...
Только как и Вы сами выше не преминули заметить, замечу что речь велась об операции *(uint16_t *)pData, кою компилятор ну никак не мог превратить ни в LDM/STM ни в LDRD/STRD ни во что другое кроме как LDRH, которая на M3 не подвержена HF cool.gif

PS: А автору полезно было-бы завести типы для работы с невыровненными данными например:
Код
typedef __packed u16 u16p8;
typedef __packed s16 s16p8;
typedef __packed u32 u32p8;
typedef __packed s32 s32p8;
typedef __packed u64 u64p8;
typedef __packed s64 s64p8;
typedef __packed u32 u32p16;
typedef __packed s32 s32p16;
typedef __packed u64 u64p16;
typedef __packed s64 s64p16;
typedef __packed u64 u64p32;
typedef __packed s64 s64p32;
Go to the top of the page
 
+Quote Post

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

 


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


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