working rfid and i2c

This commit is contained in:
2024-06-15 23:38:18 -05:00
parent 0b0d0f4875
commit edd2e31321
130 changed files with 187 additions and 24919 deletions
+186 -14
View File
@@ -48,11 +48,48 @@ SPI_HandleTypeDef hspi1;
UART_HandleTypeDef huart2;
/* USER CODE BEGIN PV */
/* Bitwise changed buffer */
uint8_t delta;
#define DELTA_KP_BIT 0
#define DELTA_BTN_BIT 1
#define DELTA_CARD_PRESENT_BIT 2
#define DELTA_CARD_ID_BIT 3
uint8_t i2c_register;
// TODO: this doesn't need to be high and low, it can simply send 2 bytes
#define I2C_REGISTER_DELTA 1
#define I2C_REGISTER_KEYPAD 2
#define I2C_REGISTER_BUTTON 3
#define I2C_REGISTER_RFID_PRESENT 4
#define I2C_REGISTER_RFID_ID 5
// Keeps track of the current state of receiving on the I2C bus.
uint8_t i2c_reciving_status;
#define I2C_RECEIVING_NONE 0
#define I2C_RECEIVING_REGISTER 1
// Keeps track of the current state of transmitting on the I2C bus.
uint8_t i2c_transmitting_status;
#define I2C_TRANSMITTING_NONE 0
#define I2C_TRANSMITTING_REGISTER 1
uint16_t old_keypad_state;
uint16_t keypad_state;
uint16_t old_button_state;
uint16_t button_state;
uint8_t old_card_present;
uint8_t card_present;
#define CARD_ID_LEN 4
uint8_t old_card_id[CARD_ID_LEN] = {0};
uint8_t card_id[CARD_ID_LEN] = {0};
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
@@ -77,6 +114,7 @@ void scan_keypad(void);
void scan_buttons(void);
void send_iterupt(void);
void rfid_check_card(void);
void printBinary(uint16_t num) {
@@ -89,9 +127,7 @@ void printBinary(uint16_t num) {
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t data[8] = {0};
uint16_t recv_cnt = 0;
/* USER CODE END 0 */
/**
@@ -130,26 +166,32 @@ int main(void)
init_keypad();
init_buttons();
rc522_init();
printf("Hello, world!\r\n");
HAL_I2C_EnableListen_IT(&hi2c1);
printf("initialized\r\n");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
uint8_t rfid_id[4] = {0};
while (1)
{
HAL_Delay(500);
// scan_keypad();
// scan_buttons();
// HAL_Delay(500);
scan_keypad();
scan_buttons();
rfid_check_card();
// send_iterupt();
// // ensure we are listening for i2c requests
// if (i2c_reciving_status == I2C_RECEIVING_NONE) {
// // listen for a register value
// HAL_I2C_Slave_Seq_Receive_IT(&hi2c1, &i2c_register, 1, I2C_NEXT_FRAME);
// i2c_reciving_status = I2C_RECEIVING_REGISTER;
// }
// printBinary(keypad_state);
// printf("s: %d\r\n", keypad_state);
// printf("r: %d\r\n", recv_cnt);
// printf("d: %d %d %d %d, %d %d %d %d\r\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
// HAL_I2C_Slave_Receive_IT(&hi2c1, (uint8_t*)&data, 8);
if(rc522_checkCard(rfid_id)) {
printf("0x%x 0x%x 0x%x 0x%x\r\n", rfid_id[0], rfid_id[1], rfid_id[2], rfid_id[3]);
}
/* USER CODE END WHILE */
@@ -458,12 +500,112 @@ PUTCHAR_PROTOTYPE
return ch;
}
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef* hi2c)
void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
{
recv_cnt += 1;
i2c_register = 0;
HAL_I2C_EnableListen_IT(hi2c);
}
void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode) {
if (TransferDirection == I2C_DIRECTION_TRANSMIT) {
HAL_I2C_Slave_Seq_Receive_IT(hi2c, &i2c_register, 1, I2C_NEXT_FRAME);
} else {
send_register();
}
}
uint8_t send_data[2];
void send_register(void) {
switch (i2c_register) {
case I2C_REGISTER_DELTA:
HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1, &delta, 1, I2C_NEXT_FRAME);
break;
case I2C_REGISTER_KEYPAD:
send_data[0] = keypad_state & 0xFF;
send_data[1] = keypad_state >> 8;
HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1, &send_data, 2, I2C_NEXT_FRAME);
delta &= ~(1 << DELTA_KP_BIT);
break;
case I2C_REGISTER_BUTTON:
send_data[0] = button_state & 0xFF;
send_data[1] = button_state >> 8;
HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1, &send_data, 2, I2C_NEXT_FRAME);
delta &= ~(1 << DELTA_BTN_BIT);
break;
case I2C_REGISTER_RFID_PRESENT:
HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1, &card_present, 1, I2C_NEXT_FRAME);
delta &= ~(1 << DELTA_CARD_PRESENT_BIT);
break;
case I2C_REGISTER_RFID_ID:
HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1, card_id, 4, I2C_NEXT_FRAME);
delta &= ~(1 << DELTA_CARD_ID_BIT);
break;
default:
break;
}
}
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
{
// uint8_t data[32];
// int len = sprintf(data, "reg: %d", i2c_register);
// HAL_UART_Transmit(&huart2, data, len, 0xFFFF);
send_register();
}
void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)
{
}
//uint8_t send_value;
//void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef* hi2c)
//{
// printf("cb\r\n");
//
// if (i2c_reciving_status == I2C_RECEIVING_REGISTER) {
// i2c_transmitting_status = I2C_TRANSMITTING_REGISTER;
//
// switch (i2c_register) {
// case I2C_REGISTER_DELTA:
// HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1, &delta, 1, I2C_NEXT_FRAME);
// break;
// case I2C_REGISTER_KEYPAD_L:
// send_value = keypad_state & 0xFF;
// HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1, &send_value, 1, I2C_NEXT_FRAME);
// break;
// case I2C_REGISTER_KEYPAD_H:
// send_value = keypad_state >> 8;
// HAL_I2C_Slave_Transmit_IT(&hi2c1, &send_value, 1);
// break;
//
// case I2C_REGISTER_BUTTON_L:
// send_value = button_state & 0xFF;
// HAL_I2C_Slave_Transmit_IT(&hi2c1, &send_value, 1);
// break;
// case I2C_REGISTER_BUTTON_H:
// send_value = button_state >> 8;
// HAL_I2C_Slave_Transmit_IT(&hi2c1, &send_value, 1);
// break;
//
// case I2C_REGISTER_RFID_PRESENT:
// HAL_I2C_Slave_Transmit_IT(&hi2c1, &card_present, 1);
// break;
// case I2C_REGISTER_RFID_ID:
// HAL_I2C_Slave_Transmit_IT(&hi2c1, card_id, 4);
// break;
// }
// }
//
// // TODO: handle any other receiving status possibilities
//
// // clear receiving status
// i2c_reciving_status = I2C_RECEIVING_NONE;
//}
void init_keypad(void)
{
HAL_GPIO_WritePin(KP_C1_GPIO_Port, KP_C1_Pin, GPIO_PIN_SET);
@@ -511,6 +653,10 @@ void scan_keypad(void)
keypad_state |= (HAL_GPIO_ReadPin(KP_R3_GPIO_Port, KP_R3_Pin) == GPIO_PIN_RESET) << 14;
keypad_state |= (HAL_GPIO_ReadPin(KP_R4_GPIO_Port, KP_R4_Pin) == GPIO_PIN_RESET) << 15;
HAL_GPIO_WritePin(KP_C4_GPIO_Port, KP_C4_Pin, GPIO_PIN_SET);
if (keypad_state != old_keypad_state) {
delta |= 1 << DELTA_KP_BIT;
}
}
void scan_buttons(void)
@@ -538,11 +684,37 @@ void scan_buttons(void)
button_state |= (HAL_GPIO_ReadPin(ROW3_GPIO_Port, ROW3_Pin) == GPIO_PIN_RESET) << 10;
button_state |= (HAL_GPIO_ReadPin(ROW4_GPIO_Port, ROW4_Pin) == GPIO_PIN_RESET) << 11;
HAL_GPIO_WritePin(COL3_GPIO_Port, COL3_Pin, GPIO_PIN_RESET);
// TODO: read the touch sensors here too!
if (button_state != old_button_state) {
delta |= 1 << DELTA_KP_BIT;
}
}
void rfid_check_card() {
old_card_present = card_present;
for (int i = 0; i < CARD_ID_LEN; i++) {
old_card_id[i] = card_id[i];
}
card_present = rc522_checkCard(card_id);
// set delta
if (old_card_present != card_present) {
delta |= 1 << DELTA_CARD_PRESENT_BIT;
}
for (int i = 0; i < CARD_ID_LEN; i++) {
if (old_card_id[i] != card_id[i]) {
delta |= 1 << DELTA_CARD_ID_BIT;
break;
}
}
}
void send_iterupt(void)
{
HAL_GPIO_WritePin(INT_GPIO_Port, INT_Pin, delta != 0);
}
/* USER CODE END 4 */