洪嵐峰 發表於 2023-5-5 20:08:45

USB隨身碟

PIC16F877A微控制器制作可拆卸2TB以上容量USB隨身碟:

元件列表
PIC16F877A 微控制器
USB 3.0 控制器
存儲器模塊(2TB以上容量)
USB-A 連接器
空白電路板

腳位連接
以下是PIC16F877A微控制器與其他元件之間的連接方式:

PIC16F877A 的VCC腳位與USB 3.0控制器和存儲器模塊的VCC線連接。
PIC16F877A 的GND腳位與USB 3.0控制器和存儲器模塊的GND線連接。
PIC16F877A 的RA0-RX腳位與USB 3.0控制器的D+線連接。
PIC16F877A 的RA1-TX腳位與USB 3.0控制器的D-線連接。
存儲器模塊的CS、MOSI、MISO和SCK腳位分別與PIC16F877A的RB0、RB1、RB2和RB3腳位連接。
USB-A連接器的VCC、D+、D-和GND腳位分別與PIC16F877A的VCC、RA0、RA1和GND腳位連接。

程式碼
以下是PIC16F877A程式碼示例
用於控制USB隨身碟的基本功能
包括初始化微控制器、USB控制器和存儲器模塊
並且從存儲器模塊讀取數據並將其傳送到USB控制器
或者從USB控制器接收數據並將其寫入存儲器模塊。


#include <pic.h>
#include <usb.h>
#include <storage.h>

// 定義存儲器的容量(單位:字節)
#define STORAGE_CAPACITY (2UL * 1024UL * 1024UL * 1024UL * 2UL)

// 定義存儲器的扇區大小(單位:字節)
#define STORAGE_SECTOR_SIZE 512

// 定義存儲器的起始扇區位置
#define STORAGE_START_SECTOR 0

// 定義存儲器的結束扇區位置
#define STORAGE_END_SECTOR (STORAGE_CAPACITY / STORAGE_SECTOR_SIZE)

void main() {
    // 初始化 PIC16F877A 微控制器
    TRISB = 0; // 設置 RB 引腳
    TRISA = 0b00000011; // 設置 RA0 和 RA1 引腳
    ANSEL = 0; // 禁用 ADC
    CMCON = 0x07; // 禁用比較器
    PORTB = 0; // 清空 RB 引腳
    PORTA = 0; // 清空 RA 引腳

// 初始化 USB 控制器
usb_init(); // 初始化 USB 控制器
usb_wait_for_enumeration(); // 等待 USB 連接

// 初始化存儲器模塊
storage_init(STORAGE_CAPACITY, STORAGE_SECTOR_SIZE, STORAGE_START_SECTOR, STORAGE_END_SECTOR);

// 循環處理主要邏輯
while (1) {
    // 檢查是否有數據可從 USB 控制器讀取
    if (usb_has_data()) {
        // 從 USB 控制器讀取數據
        uint8_t buffer;
        uint8_t size = usb_receive_data(buffer, 64);

        // 將數據寫入存儲器模塊
        uint32_t sector = storage_get_next_write_sector();
        storage_write_sector(sector, buffer, size);
    }

    // 檢查是否有數據可從存儲器模塊讀取
    if (storage_has_data()) {
        // 從存儲器模塊讀取數據
        uint8_t buffer;
        uint32_t sector = storage_get_next_read_sector();
        storage_read_sector(sector, buffer, 64);

        // 將數據傳送到 USB 控制器
        usb_send_data(buffer, 64);
    }
}
}



此代碼使用了一些函數庫,如USB庫和存儲器庫,可以通過PIC C編譯器進行編譯和燒錄到PIC16F877A微控制器上。
該代碼的主要邏輯是檢查USB控制器和存儲器模塊中是否有數據可供讀取或寫入,並根據需要進行相應的操作。
頁: [1]
查看完整版本: USB隨身碟