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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> STM32 HAL SPI ошибка или глюки IAR,, ошибка чтения SPI с помощью HAL от CubeMX
esaulenka
сообщение Jul 29 2016, 13:42
Сообщение #31


Знающий
****

Группа: Свой
Сообщений: 941
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(serglg @ Jul 29 2016, 09:12) *
Ну вот и моя хитрость. Чтение делаю 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];
}



--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Pasa
сообщение Jul 29 2016, 15:04
Сообщение #32


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 4-03-09
Из: Беларусь, Минск
Пользователь №: 45 665



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

Цитата(k155la3 @ Jul 29 2016, 15:42) *
Если вы после приведенного фрагмента кода не используете явно 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 - Jul 29 2016, 16:17
Go to the top of the page
 
+Quote Post
serglg
сообщение Jul 30 2016, 05:43
Сообщение #33


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 19-07-16
Пользователь №: 92 603



Открываются глаза. Народ говорит, что вся разница в том, что 'L4 есть "Data packing", а вот в семействах STM32f4... его нет.
Go to the top of the page
 
+Quote Post
Pasa
сообщение Aug 1 2016, 07:57
Сообщение #34


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 4-03-09
Из: Беларусь, Минск
Пользователь №: 45 665



На сегодняшний момент моя примочка по предварительной очистке DR регистра успешно опробована, все работает, обмен с CC2500 идет нормально. Будем надеятся, что в следующих ревизиях все поправят.
Go to the top of the page
 
+Quote Post
serglg
сообщение Aug 1 2016, 12:14
Сообщение #35


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 19-07-16
Пользователь №: 92 603



Цитата(Pasa @ Aug 1 2016, 13:57) *
На сегодняшний момент моя примочка по предварительной очистке DR регистра успешно опробована, все работает, обмен с CC2500 идет нормально. Будем надеятся, что в следующих ревизиях все поправят.


Фактически я делаю то же самое, но другим способом. :-)
Go to the top of the page
 
+Quote Post
Pasa
сообщение Aug 1 2016, 19:24
Сообщение #36


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 4-03-09
Из: Беларусь, Минск
Пользователь №: 45 665



Цитата(serglg @ Aug 1 2016, 15:44) *
Фактически я делаю то же самое, но другим способом. :-)

Собственно так и есть. Единственно - я напрямую читаю DR без вызова HAL-функции. Тройной вызов HAL_Recive() думается достаточно сильно замедляет многобайтовое чтение.
Хотя там где скорости не важны, то можно делать как кому больше нравится.
Go to the top of the page
 
+Quote Post
serglg
сообщение Aug 2 2016, 13:17
Сообщение #37


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 19-07-16
Пользователь №: 92 603



Цитата(Pasa @ Aug 2 2016, 01:24) *
Собственно так и есть. Единственно - я напрямую читаю DR без вызова HAL-функции. Тройной вызов HAL_Recive() думается достаточно сильно замедляет многобайтовое чтение.
Хотя там где скорости не важны, то можно делать как кому больше нравится.


Ну да, там у меня чтение нескольких байт за 25 мсек.
Хотя прямое чтение DR - это надо иметь в виду.
Теперь скоро буду с 1-мегабайтной памятью по SPI работать.
Вот там посмотрим. :-)
Go to the top of the page
 
+Quote Post
ave!
сообщение May 9 2017, 18:34
Сообщение #38


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 20-05-11
Пользователь №: 65 166



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

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

Поделитесь рабочим кодом под STM32F030 для RC522.
Go to the top of the page
 
+Quote Post
serglg
сообщение May 10 2017, 05:04
Сообщение #39


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 19-07-16
Пользователь №: 92 603



Цитата(ave! @ May 10 2017, 00:34) *
Прочитал всю ветку, пробовал все варианты под 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 ( 3.56 килобайт ) Кол-во скачиваний: 2
Прикрепленный файл  mfrc522.rar ( 3.56 килобайт ) Кол-во скачиваний: 2
 
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 17th November 2017 - 17:49
Рейтинг@Mail.ru


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