洪嵐峰 發表於 2023-5-6 19:27:00

SIM卡對拷機

製作SIM卡對拷機需要以下材料:

LPC11U35FHI33/501 微控制器板
SIM卡插座
3.3V電源供應器
USB轉串口模塊
杜邦線
麵包板

以下是LPC11U35FHI33/501的連結腳位:

P0.15 – UART1_TXD
P0.16 – UART1_RXD
P0.11 – SIM卡VCC電源
P0.12 – SIM卡GND電源
P0.13 – SIM卡RST引腳
P0.14 – SIM卡I/O引腳

以下是LPC11U35FHI33/501的程式碼,使用Keil開發環境和C語言編寫:


#include <LPC11Uxx.h>
#include <stdio.h>

#define SIM_VCC     (1 << 11)
#define SIM_GND     (1 << 12)
#define SIM_RST     (1 << 13)
#define SIM_IO      (1 << 14)

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 |= SIM_VCC | SIM_GND | SIM_RST | SIM_IO; // set SIM card pins as output
    LPC_GPIO->CLR = SIM_VCC | SIM_GND | SIM_RST | SIM_IO; // set SIM card pins low
    LPC_GPIO->SET = SIM_VCC;                  // enable SIM card power supply
    LPC_GPIO->CLR = SIM_RST;                  // reset SIM card
    for (volatile int i = 0; i < 50000; i++);    // wait for a while
    LPC_GPIO->SET = 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 = SIM_IO;                  // set SIM_IO low to select SIM card
}

void sim_deselect(void) {
    LPC_GPIO->SET = 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 = SIM_CLK;              // set SIM_CLK low
    if (data & (1 << (7 - i))) {
        LPC_GPIO->SET = SIM_DATA;         // set SIM_DATA high
    } else {
        LPC_GPIO->CLR = SIM_DATA;         // set SIM_DATA low
    }
    LPC_GPIO->SET = SIM_CLK;              // set SIM_CLK high
}
LPC_GPIO->CLR = SIM_CLK;                  // set SIM_CLK low
LPC_GPIO->DIR &= ~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 = SIM_CLK;              // set SIM_CLK high
    if (LPC_GPIO->B) {
        response |= 0x01;
    }
    LPC_GPIO->CLR = SIM_CLK;              // set SIM_CLK low
}
LPC_GPIO->DIR |= 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 = sim_receive_byte();
}
}

void sim_send_bytes(const unsigned char *data, int len) {
for (int i = 0; i < len; i++) {
sim_send_byte(data);
}
}

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;
}



上面的程式碼是初始化LPC11U35FHI33/501微控制器板,以及提供了一些與SIM卡通信的函數,例如`sim_init`初始化SIM卡,`sim_select`選擇SIM卡,`sim_send_byte`發送一個字節的數據到SIM卡,以及`sim_receive_byte`接收一個字節的數據。
在`main`函數中,你可以根據需要使用這些函數來發送和接收SIM卡命令。
頁: [1]
查看完整版本: SIM卡對拷機