Перейти к содержанию
    

STM32 HAL SPI ошибка или глюки IAR,

Ну вот и моя хитрость. Чтение делаю 3 (три) раза подряд.

 

Извините за резкость, но, может быть, стоило разик подумать?..

В даташите прямо картинками нарисовано, даже читать особо не надо:

- записать адрес регистра0

- считать мусор

- записать адрес регистра1

- считать данные регистра0

 

 

uint8_t TM_MFRC522_ReadRegister(uint8_t addr) 
{
    uint8_t cmd[2];
    uint8_t answ[2];

    cmd[0]=cmd[1]= (addr << 1) | 0x80;

    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, GPIO_PIN_RESET);
    HAL_SPI_TransmitReceive(&hspi1, cmd, answ, 2, 20);
    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, GPIO_PIN_SET);

    return answ[1];
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может здесь и говорится о нашей проблемке ..... страница 9

 

Если вы после приведенного фрагмента кода не используете явно data1,2,3.

- data1 после (2) не упоминается - так зачем он нужен ?

- элемент массива записывается в неупоминаемый data1 - так зачем он (массив) нужен ?

А то что вы в ф-ию передали &Var, и что этот адрес принадлежит именно Var - компилятор "не знает".

-------

В общем мои "смутные сомненья" Вы поняли. Это IMHO.

 

возможно есть такие сверхумные компиляторы...с суппероптимизацией....я пока до сих пор с такими "глубокими" эффектами не сталкивался.

Неиспользуемые переменные, невызываемые функции, глухие циклы для задержек - это я видел, убирает на раз.

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

Но возникает вопрос работы с указателями. И какова "глубина" этих цепочек.

Если к примеру:

int a1,a2,a3............................a999;
a1=0;
a2=a1;
a3=a2;
......
a999 = a998;

data1= a999;

 

Если все эти строки разбросаны по сотням тысяч строк кода, и не будет присвоения data1=a999 то все уберется?

А если будет присвоение data1=a999, то компилер полезет искать использование data1 во всем проекте и участие data1 в многочисленных структурах, массивах, указателях, функциях. И соотвественно начнет смотреть на использование этих структур,массивов, функций в проекте...и так далее и так до бесконечности?

Утверждать стопроцентно не буду....но есть у меня сомнения....

Изменено пользователем Pasa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Открываются глаза. Народ говорит, что вся разница в том, что 'L4 есть "Data packing", а вот в семействах STM32f4... его нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На сегодняшний момент моя примочка по предварительной очистке DR регистра успешно опробована, все работает, обмен с CC2500 идет нормально. Будем надеятся, что в следующих ревизиях все поправят.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На сегодняшний момент моя примочка по предварительной очистке DR регистра успешно опробована, все работает, обмен с CC2500 идет нормально. Будем надеятся, что в следующих ревизиях все поправят.

 

Фактически я делаю то же самое, но другим способом. :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Фактически я делаю то же самое, но другим способом. :-)

Собственно так и есть. Единственно - я напрямую читаю DR без вызова HAL-функции. Тройной вызов HAL_Recive() думается достаточно сильно замедляет многобайтовое чтение.

Хотя там где скорости не важны, то можно делать как кому больше нравится.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собственно так и есть. Единственно - я напрямую читаю DR без вызова HAL-функции. Тройной вызов HAL_Recive() думается достаточно сильно замедляет многобайтовое чтение.

Хотя там где скорости не важны, то можно делать как кому больше нравится.

 

Ну да, там у меня чтение нескольких байт за 25 мсек.

Хотя прямое чтение DR - это надо иметь в виду.

Теперь скоро буду с 1-мегабайтной памятью по SPI работать.

Вот там посмотрим. :-)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прочитал всю ветку, пробовал все варианты под CooCox и Keil, SPL и HAL - у меня не работает на STM32F030K6.

 

На STM32F103С8 у меня работает и SPL и HAL - https://zxlogin.com/stm/stm32f103-rc522+hal.zip

 

Поделитесь рабочим кодом под STM32F030 для RC522.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прочитал всю ветку, пробовал все варианты под CooCox и Keil, SPL и HAL - у меня не работает на STM32F030K6.

 

На STM32F103С8 у меня работает и SPL и HAL - https://zxlogin.com/stm/stm32f103-rc522+hal.zip

 

Поделитесь рабочим кодом под STM32F030 для RC522.

 

Могу только предложить то, что у меня работает для STM32L476.

 

Куб проиницилизировал SPI так (8 бит, 5 МГц):

 

static void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

}

 

Все функции в файле - mfrc522.c (прикладываю).

После запуска моей программы - инициализация RC522:

 

void TM_MFRC522_Init(void) 
    {
    TM_MFRC522_Reset();

    TM_MFRC522_WriteRegister(MFRC522_REG_T_MODE, 0x8D);
    TM_MFRC522_WriteRegister(MFRC522_REG_T_PRESCALER, 0x3E);
    TM_MFRC522_WriteRegister(MFRC522_REG_T_RELOAD_L, 30);           
    TM_MFRC522_WriteRegister(MFRC522_REG_T_RELOAD_H, 0);

    /* 48dB gain */
    TM_MFRC522_WriteRegister(MFRC522_REG_RF_CFG, 0x70);
    
    TM_MFRC522_WriteRegister(MFRC522_REG_TX_AUTO, 0x40);
    TM_MFRC522_WriteRegister(MFRC522_REG_MODE, 0x3D);

    TM_MFRC522_AntennaOn();        //Open the antenna
        
    }

 

Потом для чтения ID карты вызываю:

 

                STAT=TM_MFRC522_Check(CardID);
                SC522=0;
                if (STAT==0)
                    {
                                        }

 

Все мои беды в прошлом году были с буфером Фифо в STM32.

И всё поперло после глупости, что я применил при чтении регистров RC522:

 

uint8_t TM_MFRC522_ReadRegister(uint8_t addr) 
    {
    uint8_t val;
    
    ZAPRC522[0] = (addr << 1) & 0x7E;
    ZAPRC522[0] = ZAPRC522[0] | 0x80;

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
    HAL_SPI_TransmitReceive(&hspi1, ZAPRC522, OTVRC522, 2, 20);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
    val = OTVRC522[0];
        
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
    HAL_SPI_TransmitReceive(&hspi1, ZAPRC522, OTVRC522, 2, 20);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
    val = OTVRC522[0];

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
    HAL_SPI_TransmitReceive(&hspi1, ZAPRC522, OTVRC522, 2, 20);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
    val = OTVRC522[0];
        
    return val;
        
    }

 

Глупость в 3-кратном чтении одно и того же.

Но работает.

Но работает только с HAL-драйверами для STM32L4... не позже октября 2016 (версия 1.5.0).

После их обновления в феврале (версия 1.7.0) перестала работать.

Я смотрел отличия - ребята пытались как раз что-то замутить с фифо.

Но я убирал своё 3-краное чтение, комбинировал всяко, но облом.

Пришлось вернуться на драйверы октября 2016 и так оставить.

Похоже вопрос с 8-битным чтением по SPI в STM32 (через HAL) так нормально и не решен.

mfrc522.rar

mfrc522.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...