ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
688518
Лагунов (22.07.2016 13:07, просмотров: 1181)
Ну вот. Убедился с помощью Ардуино (ха-ха-ха), что считыватель Мифаре RC522 и сами карты у меня рабочие. Так чего ж не так? Использовал доработанную библиотеку от http://stm32f4-dis …522-stm32f4xx-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 Вот так делаю инициализацию RC522: void TM_MFRC522_Init(void) { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_RESET); HAL_Delay(500); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_SET); HAL_Delay(500); 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 } Потом просто циклично вызываю опрос TM_MFRC522_Check: 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(2); return status; } На TM_MFRC522_Anticoll никогда не выходит. Потому что после TM_MFRC522_Request(PICC_REQIDL, id) никто не отвечает. 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_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) { 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; 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; }