void uart_init(void) {
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 16); // enable UART clock
LPC_SYSCON->UARTCLKDIV = 1; // set UART clock divider to 1
LPC_IOCON->PIO1_6 |= 0x01; // set PIO1_6 to TXD mode
LPC_IOCON->PIO1_7 |= 0x01; // set PIO1_7 to RXD mode
LPC_UART->LCR = (1 << 7); // set DLAB bit to enable baud rate setting
LPC_UART->DLM = 0; // set baud rate to 9600
LPC_UART->DLL = 104;
LPC_UART->FDR = (1 << 4) | 5;
LPC_UART->LCR = 3; // set data length to 8 bits, no parity, 1 stop bit
}
void sim_init(void) {
LPC_GPIO->DIR[0] |= SIM_VCC | SIM_GND | SIM_RST | SIM_IO; // set SIM card pins as output
LPC_GPIO->CLR[0] = SIM_VCC | SIM_GND | SIM_RST | SIM_IO; // set SIM card pins low
LPC_GPIO->SET[0] = SIM_VCC; // enable SIM card power supply
LPC_GPIO->CLR[0] = SIM_RST; // reset SIM card
for (volatile int i = 0; i < 50000; i++); // wait for a while
LPC_GPIO->SET[0] = SIM_RST; // release SIM card reset
for (volatile int i = 0; i < 50000; i++); // wait for a while
}
void sim_select(void) {
LPC_GPIO->CLR[0] = SIM_IO; // set SIM_IO low to select SIM card
}
void sim_deselect(void) {
LPC_GPIO->SET[0] = SIM_IO; // set SIM_IO high to deselect SIM card
}
void sim_send_byte(unsigned char data) {
for (int i = 0; ifor (int i = 0; i < 8; i++) {
LPC_GPIO->CLR[0] = SIM_CLK; // set SIM_CLK low
if (data & (1 << (7 - i))) {
LPC_GPIO->SET[0] = SIM_DATA; // set SIM_DATA high
} else {
LPC_GPIO->CLR[0] = SIM_DATA; // set SIM_DATA low
}
LPC_GPIO->SET[0] = SIM_CLK; // set SIM_CLK high
}
LPC_GPIO->CLR[0] = SIM_CLK; // set SIM_CLK low
LPC_GPIO->DIR[0] &= ~SIM_DATA; // set SIM_DATA as input
for (volatile int i = 0; i < 500; i++); // wait for a while
unsigned char response = 0;
for (int i = 0; i < 8; i++) {
response <<= 1;
LPC_GPIO->SET[0] = SIM_CLK; // set SIM_CLK high
if (LPC_GPIO->B[0][SIM_DATA]) {
response |= 0x01;
}
LPC_GPIO->CLR[0] = SIM_CLK; // set SIM_CLK low
}
LPC_GPIO->DIR[0] |= SIM_DATA; // set SIM_DATA as output
return response;
}
void sim_receive_bytes(unsigned char *data, int len) {
for (int i = 0; i < len; i++) {
data[i] = sim_receive_byte();
}
}
void sim_send_bytes(const unsigned char *data, int len) {
for (int i = 0; i < len; i++) {
sim_send_byte(data[i]);
}
}
int main(void) {
uart_init(); // initialize UART for debugging
sim_init(); // initialize SIM card
sim_select(); // select SIM card
// TODO: implement SIM card commands here
sim_deselect(); // deselect SIM card
while (1);
return 0;
}