|
STM32 HAL SPI ошибка или глюки IAR,, ошибка чтения SPI с помощью HAL от CubeMX |
|
|
|
Jul 27 2016, 10:20
|
Частый гость
 
Группа: Свой
Сообщений: 107
Регистрация: 4-03-09
Из: Беларусь, Минск
Пользователь №: 45 665

|
STM32F051, IAR, CubeMX Читаю в пакетном режиме два регистра - ответ правильный. Добавляю чтение 3-его регистра - в приемном буфере ерунда. На осцилографе картинка нормальная - все диаграмы и ответы красивые и правильные... В парметрах функции пробовал и 3 сразу читать и в цикле по одному байту - не получается.... И вот так уже попробовал: Код uint8_t localRxBuf[4]; uint8_t data1,data2,data3;
HAL_SPI_Receive(&hspi1, (uint8_t*)&localRxBuf[0], 1, 10000); data1 = localRxBuf[0]; HAL_SPI_Receive(&hspi1, (uint8_t*)&localRxBuf[0], 1, 10000); data2 = localRxBuf[0]; //HAL_SPI_Receive(&hspi1, (uint8_t*)&localRxBuf[0], 1, 10000); //data3 = localRxBuf[0]; придобавлении третьего чтения портятся data1,data2,data3......мистика какая-то. Повторюсь - на осцилографе все красиво и правильно Такое ощущение, что HAL-библиотека глючит... внутрь HAL что-ли полезть
Сообщение отредактировал IgorKossak - Jul 27 2016, 14:30
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!
|
|
|
|
|
 |
Ответов
|
Jul 29 2016, 06:12
|
Частый гость
 
Группа: Участник
Сообщений: 146
Регистрация: 19-07-16
Пользователь №: 92 603

|
Ну вот и моя хитрость. Чтение делаю 3 (три) раза подряд. К примеру мне надо установить бит в каком либо регистре. Раньше (в типовом пример из интернета) было так: Код void TM_MFRC522_SetBitMask(uint8_t reg, uint8_t mask) { TM_MFRC522_WriteRegister(reg, TM_MFRC522_ReadRegister(reg) | mask); } Глючит. А вот так работает уверенно: Код void TM_MFRC522_SetBitMask(uint8_t reg, uint8_t mask) { int BUFR; BUFR=TM_MFRC522_ReadRegister(reg); BUFR=TM_MFRC522_ReadRegister(reg); BUFR=TM_MFRC522_ReadRegister(reg); BUFR=BUFR | mask; TM_MFRC522_WriteRegister(reg, BUFR); } А можно и по другому, саму функцию TM_MFRC522_ReadRegister вызываем только раз, Код void TM_MFRC522_SetBitMask(uint8_t reg, uint8_t mask) { int BUFR; BUFR=TM_MFRC522_ReadRegister(reg); BUFR=BUFR | mask; TM_MFRC522_WriteRegister(reg, BUFR); } а вот в ней: Код uint8_t TM_MFRC522_ReadRegister(uint8_t addr) { uint8_t val; uint8_t j; j=addr; ZAPRC522[0] = (addr << 1) & 0x7E; ZAPRC522[0] = ZAPRC522[0] | 0x80;
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, ZAPRC522, OTVRC522, 2, 20); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, GPIO_PIN_SET); BUFRC522[j]=OTVRC522[0]; HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, ZAPRC522, OTVRC522, 2, 20); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, GPIO_PIN_SET); BUFRC522[j]=OTVRC522[0]; HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, ZAPRC522, OTVRC522, 2, 20); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, GPIO_PIN_SET); BUFRC522[j]=OTVRC522[0]; val = OTVRC522[0]; return val; }
Сообщение отредактировал IgorKossak - Jul 29 2016, 07:39
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!
|
|
|
|
|
Jul 29 2016, 07:30
|
Частый гость
 
Группа: Участник
Сообщений: 130
Регистрация: 26-06-06
Из: Березовский
Пользователь №: 18 355

|
Цитата(serglg @ Jul 29 2016, 11:12)  Ну вот и моя хитрость Это не хитрость. Это глупость. Вы не попытались разобраться, почему не работает первый вариант и чего в нем не хватает. А не хватает только второго чтения из вашей MRFC, так как данные отдаются следующим после адреса байтом.
|
|
|
|
|
Jul 29 2016, 08:36
|
Частый гость
 
Группа: Участник
Сообщений: 146
Регистрация: 19-07-16
Пользователь №: 92 603

|
Цитата(alag57 @ Jul 29 2016, 13:30)  Это не хитрость. Это глупость. Вы не попытались разобраться, почему не работает первый вариант и чего в нем не хватает. А не хватает только второго чтения из вашей MRFC, так как данные отдаются следующим после адреса байтом. Какого второго чтения? Функция HAL_SPI_TransmitReceive(&hspi1, ZAPRC522, OTVRC522, 2, 20) в первом байте передает адрес вторым байтом принимает. Чувствую, что в HAL-драйверах какая-то засада при работе с 8-битным приемом. Или? Вы намекаете что в функции HAL_SPI_TransmitReceive надо ставить не 2 байта а 4?
Сообщение отредактировал serglg - Jul 29 2016, 08:40
|
|
|
|
|
Jul 29 2016, 13:33
|
Частый гость
 
Группа: Участник
Сообщений: 130
Регистрация: 26-06-06
Из: Березовский
Пользователь №: 18 355

|
Цитата(serglg @ Jul 29 2016, 13:36)  Вы намекаете? Нет, не намекаю, я привел рабочий код. Нормальное чтение из SPI у меня получилось только после инициализации бита FRXTH при каждой передаче. Т.е. если длина передаваемых данных больше 1 сбрасываем бит и передаем в 16-разрядном режиме, если длина передаваемых данных равна 1 - устанавливаем бит FRXTH и передаем в 8 разрядном режиме. При этом SPI настроен на SPI_DataSize_8b. Все другие варианты, также как у вас, давали непредсказуемый результат, т.е. то правильно, то нет. Надо бы еще попробовать инициализировать сначала CR2, затем CR1, как здесь отмечали, может даст результат, хотя такого упоминания я нигде не нашел. И в SPL и в HAL(какой ужас, специально сейчас вот посмотрел) сначала инициализируется CR1, затем CR2.
|
|
|
|
Сообщений в этой теме
Pasa STM32 HAL SPI ошибка или глюки IAR, Jul 27 2016, 10:20 serglg хочу заметить, что с HAL_SPI_Receive и у меня како... Jul 27 2016, 15:57 Pasa Цитата(serglg @ Jul 27 2016, 19:27) Пока ... Jul 27 2016, 17:27  serglg Цитата(Pasa @ Jul 27 2016, 23:27) ...... ... Jul 28 2016, 04:14 Pasa В инициализации SPI в HAL:
Код if(hspi-... Jul 27 2016, 20:17 tehn1k Как Вы выбираете чтение того или иного регистра, е... Jul 28 2016, 05:41 serglg Цитата(tehn1k @ Jul 28 2016, 11:41) Как В... Jul 28 2016, 06:09  tehn1k Цитата(serglg @ Jul 28 2016, 10:09) Мне н... Jul 28 2016, 06:55  Lagman Цитата(serglg @ Jul 28 2016, 09:09) Мне н... Jul 28 2016, 09:35   k155la3 Цитата(Lagman @ Jul 28 2016, 12:35) А зач... Jul 28 2016, 10:18 k155la3 Цитата(Pasa @ Jul 27 2016, 13:20) STM32F0... Jul 28 2016, 06:09 Pasa Обмен идет с CC2500
Цитата(k155la3 @ Jul 28 ... Jul 28 2016, 19:48 k155la3 Цитата(Pasa @ Jul 27 2016, 13:20) И вот т... Jul 28 2016, 12:45 rudy_b Что-то я не понял, у вас SPI в режиме slave или m... Jul 28 2016, 13:57 alag57 В CR2 есть такой хитрый битик - FRXTH, так вот у м... Jul 28 2016, 14:41 x893 Функция SPI Receive в HAL занимает строк 20 из них... Jul 28 2016, 14:17 Pasa Цитата(x893 @ Jul 28 2016, 17:47) Функция... Jul 28 2016, 20:08  k155la3 Цитата(Pasa @ Jul 28 2016, 23:08) Никаког... Jul 29 2016, 06:47 x893 Ничего хитрого
The RXNE flag is set depending on t... Jul 28 2016, 16:14 alag57 Цитата(x893 @ Jul 28 2016, 21:14) Ничего ... Jul 29 2016, 03:11 x893 Проверил с stm32f030 и CC2500 - всё работает как ч... Jul 28 2016, 19:49 esaulenka Цитата(serglg @ Jul 29 2016, 09:12) Ну во... Jul 29 2016, 13:42 Pasa На сегодняшний момент вызывает вопрос код в HAL_SP... Jul 29 2016, 09:04 k155la3 Цитата(Pasa @ Jul 27 2016, 13:20) (1)
HAL... Jul 29 2016, 10:03 Pasa Цитата(k155la3 @ Jul 29 2016, 13:33) Позв... Jul 29 2016, 10:55  k155la3 Цитата(Pasa @ Jul 29 2016, 13:55) вы счит... Jul 29 2016, 12:12 esaulenka Цитата(k155la3 @ Jul 29 2016, 13:03) Позв... Jul 29 2016, 13:22 Pasa может здесь и говорится о нашей проблемке ..... ... Jul 29 2016, 15:04 serglg Открываются глаза. Народ говорит, что вся разница ... Jul 30 2016, 05:43 Pasa На сегодняшний момент моя примочка по предваритель... Aug 1 2016, 07:57 serglg Цитата(Pasa @ Aug 1 2016, 13:57) На сегод... Aug 1 2016, 12:14  Pasa Цитата(serglg @ Aug 1 2016, 15:44) Фактич... Aug 1 2016, 19:24   serglg Цитата(Pasa @ Aug 2 2016, 01:24) Собствен... Aug 2 2016, 13:17 ave! Прочитал всю ветку, пробовал все варианты под CooC... May 9 2017, 18:34 serglg Цитата(ave! @ May 10 2017, 00:34) Про... May 10 2017, 05:04
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|