SPI總線知識總結

1 SPI的時鐘極性CPOL和時鐘相位CPHA的設置
1.1 SPI數據傳輸位數
SPI傳輸數據過程當中老是先發送或接收高字節數據,每一個時鐘週期接收器或發送器左移一位數據。對於小於16位的數據,在發送前必須左對齊,若是接收的數據小於16位,則採用軟件將無效的數據位屏蔽。

1.2 Linux Example
@ drivers/hwmon/max1111.c
static int max1111_probe(struct spi_device *spi)
{
    enum chips chip = spi_get_device_id(spi)->driver_data;
    struct max1111_data *data;
    int err;

    spi->bits_per_word = 8;
    spi->mode = SPI_MODE_0;  //HERE
    err = spi_setup(spi);
    if (err < 0)
        return err;

    [...]
}

1.3 MCU
@ mems_init.c
spi_config.polarity = HAL_SPI_MASTER_CLOCK_POLARITY0;
spi_config.phase = HAL_SPI_MASTER_CLOCK_PHASE0;

CMH1000 sensorhub側DataRAM開始地址保留1024字節,給SPI傳輸用,分紅TX和RX,各512 bytes;sensorhub側封包最大是269 bytes(包括header和payload)。

2 SD卡SPI模式
2.1 SD卡pin映射到SPI模式
針腳       SD卡模式       SPI模式
1             CD/DAT3         CS
2             CMD                MOSI
3             VSS                 VSS
4             VCC                 VCC
5             CLK                  CLK
6             VSS                  VSS
7             DAT0                MISO
8             DAT1                NC
9             DAT2                NC

2.2 SD命令中的CMD和ACMD的區別
ACMD:Application specific ComManD, which is an application specific command rather than a standard command。
通常的CMD只有6個bit,後來發現須要的CMD類型多了,因此就擴展出了CMD55+ACMDxx的擴展模式。ACMD命令發送前須要先發送CMD55,好比ACMD41,先發送CMD55,再發送ACMD41。

2.3 SD/MMC 初始化流程
1)配置時鐘,慢速通常爲400K,設置工做模式
2)發送CMD0,進入空閒態,該指令沒有反饋
3)發送CMD8,若是有反應,CRC值與發送的值相同,說明該卡兼容SD2.0協議
4)發送CMD55+ACMD41,判斷SD卡的上電是否正確,短反饋成功說明該卡爲SD卡(短反饋第31位置1爲HC卡),不然發送CMD0,有反應說明是MMC卡
5)發送CMD2,驗證SD卡是否接入,長反饋CID(Card IDentification Register)
6)發送CMD3,讀取SD卡的RCA(地址,Relative Card Address),短反饋
7)發送CMD9,讀取CSD(Card Specific Data Register)寄存器獲取卡的相關信息
8)發送CMD7,使能SD卡
9)配置高速時鐘,準備數據傳輸,通常20M~25M
10)發送CMD55+ACMD51讀取SCR(SD Card Configuration Register)寄存器,SD卡能夠經過該值得到位寬,若是是MMC卡則須要使用主線測試來肯定卡的位寬
11)SD卡發送CMD55+ACMD6配置爲4bit數據傳輸模式(根據SCR讀出來的值肯定),MMC卡發送CMD6來設置位寬
12)發送CMD7,使能SD卡,使其進入傳輸狀態,接着發送CMD16設置塊大小(根據前面讀取的CSD信息肯定)
13)把命令參數設置爲0,再次發送CMD7,取消選中全部卡

Figure 2-1 SD卡的初始化和識別流程

2.4 Q and A
Q:SD卡的工做頻率是根據什麼來決定的?
A:目前所知不是經過讀取寄存器(可讀寫寄存器CSD、SCR等)獲取的,而是根據SD卡的類型,類型對應着工做頻率。
host端配置支持的頻率,而後SD卡自己會有支持的頻率,兩邊取都支持的最高頻率,因此須要獲得SD卡的類型,類型就對應着頻率。
in mmc.c
mmc_select_card_type() - 根據卡的類型(僅須要知道卡的類型後)選擇工做頻率,選擇的工做頻率不能大於最大工做頻率(最大工做頻率由CSD寄存器TRAN_SPEED[103:96]字段指定)。

3 SPI接口以太網芯片
WIZnet - 80 MHz SPI slave接口
ENC28J60 - Microchip Ethernet Controller,10 MHz SPI slave
CH395 - SPI slave 30 MHz

QCOM平臺使用gpll0去作分頻,SPI的速度能夠達到100 MHz

BCM8923X交換芯片- SPI slave最高速度62.5 MHz,Data Format(Big Endian序):1-byte command, 4-byte address, 1 ~ 8 bytes data,

4 ACPI - iasl_win
cat /sys/firmware/acpi/tables/DSDT > DSDT.aml
sudo apt-get install iasl
iasl -d DSDT.aml
cat DSDT.dsl

WINDOWS BINARY TOOLS
https://www.acpica.org/downloads/binary-tools

5 Abbreviations
ACMD:Application specific ComManD
ARC:Argonant RISC Core
AT91SAM9260:SAM means Smart ARM-based
ATMEL SAMBA:ATMEL Smart ARM-based Boot Assistant
DTR:Data Transfer Rate
DWC2:Design Ware Controller 2,Apple的嵌入式設備,包括iPad和iPhone都是使用的DWC2
ISP1161:Philips' Integrated host Solution Pairs 1161,「Firms introduce USB host controllers」,https://www.eetimes.com/document.asp?doc_id=1290054
MISO:mi s əu
MOSI:m əu si
QUP:高通平臺的SPI總線和I2C共用core和引腳,稱爲QUP(QCOM Universal Peripheral);而UART和QUP又共用引腳,而且稱爲BLSP
SL811HS:Cypress/ScanLogic 811 Host/Slave,性能上與ISP1161(Integrated host Solution Pairs 1161)至關
TDI:TransDimension Inc.,該公司首先發明瞭將TT集成到EHCI RootHub中的方法,這樣對於嵌入式系統來講,就省去了OHCI/UHCI的硬件,同時下降了成本,做爲對該公司的記念,Linux內核定義了宏ehci_is_TDI(ehci)
TLV:TI Low Value,高性價比
TPS:TI Performance Solution
TT:Transaction Translator(事務轉換器,將USB 2.0的包轉換成USB 1.1的包)app