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

 
 
> RFID-RC522 под STM32L476
serglg
сообщение Jul 19 2016, 06:56
Сообщение #1


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

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



Использовал доработанную библиотеку от
" http://stm32f4-discovery.net/2014/07/libra...32f4xx-devices/ "
Перед этим через STM32CubeL4 создал проект для SPI1 (под Кейл).
Соответственно в скачанной библиотеке поправил вызовы функций передачи и приема байтов по SPI через HAL-драйверы.
В результате с RC522 нормально читаю все регистры. Их содержимое соответствует тому, что должно быть после сброса по умолчанию.
Потом провожу инициализацию и вижу правильное их изменение .
Антенна включается и поле видно даже петлей.
После этого проводится непрерывный запрос карты командой 0х26 (функция из библиотеки TM_MFRC522_Check(CardID)).
В поле виден байт запроса и потом байт остановки (функция TM_MFRC522_Halt())

Независимо от присутствия/отсутствия карты ничего не происходит (всегда status = MI_ERR).
Осциллографом из ответов ничего не обнаруживается ни в поле, ни на ножках RC522.

Была попытка продублировать ответы карты внутри RC522 на ножку MFOUT (установкой регистра TxSelReg/0х16 байтом 0х17), но на этой ножке всегда 3-е состояние почему-то.
Всё это проверено на 2 считывателях, 3 картах и 2 брелках (из комплекта).

Таким образом нахожусь в недоумении.
Я что-то не включаю? Хотя по той библиотеке я делаю тот же Init.
Могут ли быть два считывателя подряд неисправными?
MFRC522 подключен к SPI1 STM32L476
PE15 - MOSI
PE14 - MISO
PE13 - SCK
PE12 - SS
PE10 - RST

При включение сначала сигнал RST выставляется в "1".
Потом инициализация:
Код
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);
   TM_MFRC522_WriteRegister(MFRC522_REG_TX_SELL, 0x15);
  
   TM_MFRC522_WriteRegister(MFRC522_REG_TX_AUTO, 0x40);
   TM_MFRC522_WriteRegister(MFRC522_REG_MODE, 0x3D);

      
    TM_MFRC522_AntennaOn();      //Open the antenna
      
   }

Привожу содержимое регистров

Далее показаны первые 31 регистр перед запросом и после запроса
(PICC_REQIDL=0х0С)
CODE
Рег. - Иниц. - Запрос+Стоп

0x01 - 0x20 - 0x0C
0x02 - 0x80 - 0xF7
0x03 - 0x00 - 0x00
0x04 - 0x14 - 0x44
0x05 - 0x00 - 0x04
0x06 - 0x00 - 0x00
0x07 - 0x29 - 0x39
0x08 - 0x00 - 0x05
0x09 - 0x26 - 0x00
0x0A - 0x00 - 0x00
0x0B - 0x08 - 0x08
0x0C - 0x10 - 0x10
0x0D - 0x00 - 0x04
0x0E - 0xA0 - 0xA0
0x0F - 0x00 <-
0x10 - 0x00 <-
0x11 - 0x3D <-
0x12 - 0x00 <-
0x13 - 0x00 <-
0x14 - 0x83 <-
0x15 - 0x40 <-
0x16 - 0x15 <-
0x17 - 0x84 <-
0x18 - 0x84 <-
0x19 - 0x4D <-
0x1A - 0x00 <-
0x1B - 0x00 <-
0x1C - 0x62 <-
0x1D - 0x00 <-
0x1E - 0x00 <-
0x1F - 0xEB <-


Сообщение отредактировал IgorKossak - Jul 19 2016, 07:24
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
serglg
сообщение Jul 26 2016, 13:46
Сообщение #2


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

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



В основном цикле у меня вызывается:
STAT = TM_MFRC522_Check(CardID);
В том файле mfrc522.c, где функция шапка:
CODE
/**
* |----------------------------------------------------------------------
* | Copyright © Tilen Majerle, 2014
* |
* | This program is free software: you can redistribute it and/or modify
* | it under the terms of the GNU General Public License as published by
* | the Free Software Foundation, either version 3 of the License, or
* | any later version.
* |
* | This program is distributed in the hope that it will be useful,
* | but WITHOUT ANY WARRANTY; without even the implied warranty of
* | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* | GNU General Public License for more details.
* |
* | You should have received a copy of the GNU General Public License
* | along with this program. If not, see <http://www.gnu.org/licenses/>.
* |----------------------------------------------------------------------
*/

/**
* Status enumeration
*
* Used with most functions
*/

#include <stdio.h>

typedef enum
{
MI_OK = 0,
MI_NOTAGERR,
MI_ERR
} TM_MFRC522_Status_t;


#define MFRC522_CS_LOW MFRC522_CS_PORT->BSRRH = MFRC522_CS_PIN;
#define MFRC522_CS_HIGH MFRC522_CS_PORT->BSRRL = MFRC522_CS_PIN;

/* MFRC522 Commands */
#define PCD_IDLE 0x00 //NO action; Cancel the current command
#define PCD_AUTHENT 0x0E //Authentication Key
#define PCD_RECEIVE 0x08 //Receive Data
#define PCD_TRANSMIT 0x04 //Transmit data
#define PCD_TRANSCEIVE 0x0C //Transmit and receive data,
#define PCD_RESETPHASE 0x0F //Reset
#define PCD_CALCCRC 0x03 //CRC Calculate

/* Mifare_One card command word */
#define PICC_REQIDL 0x26 // find the antenna area does not enter hibernation
#define PICC_REQALL 0x52 // find all the cards antenna area
#define PICC_ANTICOLL 0x93 // anti-collision
#define PICC_SElECTTAG 0x93 // election card
#define PICC_AUTHENT1A 0x60 // authentication key A
#define PICC_AUTHENT1B 0x61 // authentication key B
#define PICC_READ 0x30 // Read Block
#define PICC_WRITE 0xA0 // write block
#define PICC_DECREMENT 0xC0 // debit
#define PICC_INCREMENT 0xC1 // recharge
#define PICC_RESTORE 0xC2 // transfer block data to the buffer
#define PICC_TRANSFER 0xB0 // save the data in the buffer
#define PICC_HALT 0x50 // Sleep

/* MFRC522 Registers */
//Page 0: Command and Status
#define MFRC522_REG_RESERVED00 0x00
#define MFRC522_REG_COMMAND 0x01
#define MFRC522_REG_COMM_IE_N 0x02
#define MFRC522_REG_DIV1_EN 0x03
#define MFRC522_REG_COMM_IRQ 0x04
#define MFRC522_REG_DIV_IRQ 0x05
#define MFRC522_REG_ERROR 0x06
#define MFRC522_REG_STATUS1 0x07
#define MFRC522_REG_STATUS2 0x08
#define MFRC522_REG_FIFO_DATA 0x09
#define MFRC522_REG_FIFO_LEVEL 0x0A
#define MFRC522_REG_WATER_LEVEL 0x0B
#define MFRC522_REG_CONTROL 0x0C
#define MFRC522_REG_BIT_FRAMING 0x0D
#define MFRC522_REG_COLL 0x0E
#define MFRC522_REG_RESERVED01 0x0F
//Page 1: Command
#define MFRC522_REG_RESERVED10 0x10
#define MFRC522_REG_MODE 0x11
#define MFRC522_REG_TX_MODE 0x12
#define MFRC522_REG_RX_MODE 0x13
#define MFRC522_REG_TX_CONTROL 0x14
#define MFRC522_REG_TX_AUTO 0x15
#define MFRC522_REG_TX_SELL 0x16
#define MFRC522_REG_RX_SELL 0x17
#define MFRC522_REG_RX_THRESHOLD 0x18
#define MFRC522_REG_DEMOD 0x19
#define MFRC522_REG_RESERVED11 0x1A
#define MFRC522_REG_RESERVED12 0x1B
#define MFRC522_REG_MIFARE 0x1C
#define MFRC522_REG_RESERVED13 0x1D
#define MFRC522_REG_RESERVED14 0x1E
#define MFRC522_REG_SERIALSPEED 0x1F
//Page 2: CFG
#define MFRC522_REG_RESERVED20 0x20
#define MFRC522_REG_CRC_RESULT_M 0x21
#define MFRC522_REG_CRC_RESULT_L 0x22
#define MFRC522_REG_RESERVED21 0x23
#define MFRC522_REG_MOD_WIDTH 0x24
#define MFRC522_REG_RESERVED22 0x25
#define MFRC522_REG_RF_CFG 0x26
#define MFRC522_REG_GS_N 0x27
#define MFRC522_REG_CWGS_PREG 0x28
#define MFRC522_REG__MODGS_PREG 0x29
#define MFRC522_REG_T_MODE 0x2A
#define MFRC522_REG_T_PRESCALER 0x2B
#define MFRC522_REG_T_RELOAD_H 0x2C
#define MFRC522_REG_T_RELOAD_L 0x2D
#define MFRC522_REG_T_COUNTER_VALUE_H 0x2E
#define MFRC522_REG_T_COUNTER_VALUE_L 0x2F
//Page 3:TestRegister
#define MFRC522_REG_RESERVED30 0x30
#define MFRC522_REG_TEST_SEL1 0x31
#define MFRC522_REG_TEST_SEL2 0x32
#define MFRC522_REG_TEST_PIN_EN 0x33
#define MFRC522_REG_TEST_PIN_VALUE 0x34
#define MFRC522_REG_TEST_BUS 0x35
#define MFRC522_REG_AUTO_TEST 0x36
#define MFRC522_REG_VERSION 0x37
#define MFRC522_REG_ANALOG_TEST 0x38
#define MFRC522_REG_TEST_ADC1 0x39
#define MFRC522_REG_TEST_ADC2 0x3A
#define MFRC522_REG_TEST_ADC0 0x3B
#define MFRC522_REG_RESERVED31 0x3C
#define MFRC522_REG_RESERVED32 0x3D
#define MFRC522_REG_RESERVED33 0x3E
#define MFRC522_REG_RESERVED34 0x3F
//Dummy byte
#define MFRC522_DUMMY 0x00

#define MFRC522_MAX_LEN 16


/**
* Private functions
*/
extern TM_MFRC522_Status_t TM_MFRC522_Check(uint8_t* id);


extern void TM_MFRC522_Test(void);
extern void TM_MFRC522_InitPins(void);
extern void TM_MFRC522_WriteRegister(uint8_t addr, uint8_t val);
extern uint8_t TM_MFRC522_ReadRegister(uint8_t addr);
extern TM_MFRC522_Status_t TM_MFRC522_ToCard(uint8_t command, uint8_t* sendData, uint8_t sendLen, uint8_t* backData, uint16_t* backLen);
extern TM_MFRC522_Status_t TM_MFRC522_Request(uint8_t reqMode, uint8_t* TagType);
extern TM_MFRC522_Status_t TM_MFRC522_Anticoll(uint8_t* serNum);
extern void TM_MFRC522_SetBitMask(uint8_t reg, uint8_t mask);
extern void TM_MFRC522_ClearBitMask(uint8_t reg, uint8_t mask);
extern void TM_MFRC522_AntennaOn(void);
extern void TM_MFRC522_AntennaOff(void);
extern void TM_MFRC522_Reset(void);
extern void TM_MFRC522_Halt(void);
extern void TM_MFRC522_CalculateCRC(uint8_t* pIndata, uint8_t len, uint8_t* pOutData);
void *memcpy(void *dst, const void *src, size_t len);

uint8_t OTVRC522[2];
uint8_t BUFRC522[48];
uint8_t BUFWR522[48];
uint8_t ZAPRC522[2];


Сама функция:

TM_MFRC522_Status_t TM_MFRC522_Check(uint8_t* id)
{
TM_MFRC522_Status_t status;
//Find cards, return card type
status = TM_MFRC522_Request(PICC_REQIDL, id);
if (status == MI_OK)
{
//Card detected
//Anti-collision, return card serial number 4 bytes
status = TM_MFRC522_Anticoll(id);

}


//TM_MFRC522_Halt(); //Command card into hibernation

HAL_Delay(20);


return status;
}


Запрос:

TM_MFRC522_Status_t TM_MFRC522_Request(uint8_t reqMode, uint8_t* TagType)
{
TM_MFRC522_Status_t status;
uint16_t backBits; //The received data bits

TM_MFRC522_WriteRegister(MFRC522_REG_BIT_FRAMING, 0x07); //TxLastBists = BitFramingReg[2..0] ???

TagType[0] = reqMode;
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_RESET);

status = TM_MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);

if ((status != MI_OK) || (backBits != 0x10))
{
status = MI_ERR;
}

return status;
}

Ну и самая тяжелая часть:

TM_MFRC522_Status_t TM_MFRC522_ToCard(uint8_t command, uint8_t* sendData, uint8_t sendLen, uint8_t* backData, uint16_t* backLen)
{
TM_MFRC522_Status_t status = MI_ERR;
uint8_t irqEn = 0x00;
uint8_t waitIRq = 0x00;
uint8_t lastBits;
uint8_t n;
uint16_t i;

switch (command)
{
case PCD_AUTHENT:
{
irqEn = 0x12;
waitIRq = 0x10;
break;
}
case PCD_TRANSCEIVE:
{
irqEn = 0x77;
waitIRq = 0x30;
break;
}
default:
break;
}


TM_MFRC522_WriteRegister(MFRC522_REG_COMM_IE_N, irqEn | 0x80);
TM_MFRC522_ClearBitMask(MFRC522_REG_COMM_IRQ, 0x80);
TM_MFRC522_SetBitMask(MFRC522_REG_FIFO_LEVEL, 0x80);

TM_MFRC522_WriteRegister(MFRC522_REG_COMMAND, PCD_IDLE);

//Writing data to the FIFO
for (i = 0; i < sendLen; i++)
{
TM_MFRC522_WriteRegister(MFRC522_REG_FIFO_DATA, sendData[i]);
}

//Execute the command
TM_MFRC522_WriteRegister(MFRC522_REG_COMMAND, command);
if (command == PCD_TRANSCEIVE)
{
TM_MFRC522_SetBitMask(MFRC522_REG_BIT_FRAMING, 0x80); //StartSend=1,transmission of data starts
}

//Waiting to receive data to complete
i = 2000; //i according to the clock frequency adjustment, the operator M1 card maximum waiting time 25ms???
do
{
//CommIrqReg[7..0]
//Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq
n = TM_MFRC522_ReadRegister(MFRC522_REG_COMM_IRQ);
i--;
}
while ((i!=0) && !(n&0x01) && !(n&waitIRq));

TM_MFRC522_ClearBitMask(MFRC522_REG_BIT_FRAMING, 0x80); //StartSend=0
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_SET);

if (i != 0)
{
if (!(TM_MFRC522_ReadRegister(MFRC522_REG_ERROR) & 0x1B))
{
status = MI_OK;
if (n & irqEn & 0x01)
{
status = MI_NOTAGERR;
}

if (command == PCD_TRANSCEIVE)
{
n = TM_MFRC522_ReadRegister(MFRC522_REG_FIFO_LEVEL);

lastBits = TM_MFRC522_ReadRegister(MFRC522_REG_CONTROL) & 0x07;
VREMUART[0]=TM_MFRC522_ReadRegister(MFRC522_REG_COMMAND);
if (lastBits)
{
*backLen = (n - 1) * 8 + lastBits;
}
else
{
*backLen = n * 8;
}

if (n == 0)
{
n = 1;
}
if (n > MFRC522_MAX_LEN)
{
n = MFRC522_MAX_LEN;
}

//Reading the received data in FIFO
for (i = 0; i < n; i++)
{
backData[i] = TM_MFRC522_ReadRegister(MFRC522_REG_FIFO_DATA);
}
}
}
else
{
status = MI_ERR;
}
}

return status;
}

Чтение/запись регистров через HAL-драйверы по SPI не привожу. Много раз убеждался, что там всё работает.

Сообщение отредактировал IgorKossak - Jul 26 2016, 14:10
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 26 2016, 13:59
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(serglg @ Jul 26 2016, 16:46) *
TM_MFRC522_Status_t TM_MFRC522_Request(uint8_t reqMode, uint8_t* TagType)
{
...
TM_MFRC522_WriteRegister(MFRC522_REG_BIT_FRAMING, 0x07); //TxLastBists = BitFramingReg[2..0] ???
...
status = TM_MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);
...
}

TM_MFRC522_Status_t TM_MFRC522_ToCard(uint8_t command, uint8_t* sendData, uint8_t sendLen, uint8_t* backData, uint16_t* backLen)
{
...
if (command == PCD_TRANSCEIVE)
{
TM_MFRC522_SetBitMask(MFRC522_REG_BIT_FRAMING, 0x80); //StartSend=1,transmission of data starts
}
...
}

Сначала записываете 0x07 (TxLastBits=7), а затем стартуете с 0x80 (TxLastBits=0, что соответствует 8 битам).
Go to the top of the page
 
+Quote Post
serglg
сообщение Jul 26 2016, 15:29
Сообщение #4


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

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



Цитата(adnega @ Jul 26 2016, 19:59) *
Сначала записываете 0x07 (TxLastBits=7), а затем стартуете с 0x80 (TxLastBits=0, что соответствует 8 битам).


Но как же? Там же функция установки бита. Т.е. вроде только старший бит встает в единицу. Младшие (TxLastBits) остаются (или должны оставаться) так же - 7.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 26 2016, 18:21
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(serglg @ Jul 26 2016, 18:29) *
Но как же? Там же функция установки бита. Т.е. вроде только старший бит встает в единицу. Младшие (TxLastBits) остаются (или должны оставаться) так же - 7.

Точно. Проглядел.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- serglg   RFID-RC522 под STM32L476   Jul 19 2016, 06:56
- - adnega   Цитата(serglg @ Jul 19 2016, 09:56) Была ...   Jul 19 2016, 08:30
- - yanvasiij   Довелось мне запускать этот китайский считыватель,...   Jul 20 2016, 10:14
|- - adnega   Цитата(yanvasiij @ Jul 20 2016, 13:14) Он...   Jul 20 2016, 10:18
- - yanvasiij   Может и от ревизии зависит, но у меня зависал наме...   Jul 20 2016, 10:23
|- - adnega   Цитата(yanvasiij @ Jul 20 2016, 13:23) Мо...   Jul 20 2016, 10:32
- - serglg   Я очень хочу надеяться, что у меня эта плата (две ...   Jul 20 2016, 14:27
- - serglg   Ну вот проверил данный экземпляр считывателя с Ард...   Jul 25 2016, 07:22
|- - adnega   Цитата(serglg @ Jul 25 2016, 10:22) В раб...   Jul 25 2016, 20:10
- - serglg   весьма полезно, спасибо. Вот только не пойму почем...   Jul 26 2016, 04:51
|- - adnega   Цитата(serglg @ Jul 26 2016, 07:51) весьм...   Jul 26 2016, 11:56
- - serglg   а засада-то всё же здесь. Внезапно содержимое MFRC...   Jul 27 2016, 05:55
- - serglg   Всё решено. Подлое поведение HAL-драйверов из-под ...   Jul 29 2016, 08:32


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:58
Рейтинг@Mail.ru


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