S3C6410 SPI全雙工讀寫流程分析
一、SPI控制器datasheet
1詳細(xì)請(qǐng)參考:http://blog.csdn.net/hustyangju/article/details/20474659
2 SPI的所有寄存器都是映射到內(nèi)核空間的,采用基地址+偏移地址的方式訪問(wèn)
static volatile void __iomem *spiregs; //global variable for mapping spiregister
spiregs = (volatile)ioremap(0x7F00B000,0x30); //just request for the spi0
3 下文可能用到的偏移地址
#define S3C_CH_CFG (0x00) //SPI configuration
#define S3C_CLK_CFG (0x04) //Clock configuration
#define S3C_MODE_CFG (0x08) //SPI FIFO control
#define S3C_SLAVE_SEL (0x0C) //Slave selection
#define S3C_SPI_INT_EN (0x10) //SPI interrupt enable
#define S3C_SPI_STATUS (0x14) //SPI status
#define S3C_SPI_TX_DATA (0x18) //SPI TX data
#define S3C_SPI_RX_DATA (0x1C) //SPI RX data
#define S3C_PACKET_CNT (0x20) //count how many data master gets
#define S3C_PENDING_CLR (0x24) //Pending clear
#define S3C_SWAP_CFG (0x28) //SWAPconfig register
#define S3C_FB_CLK (0x28) //SWAP FB config register
#define SPI_CH_SW_RST (1<<5)
#define SPI_CH_MASTER (0<<4)
#define SPI_CH_SLAVE (1<<4)
#define SPI_CH_RISING (0<<3)
#define SPI_CH_FALLING (1<<3)
#define SPI_CH_FORMAT_A (0<<2)
#define SPI_CH_FORMAT_B (1<<2)
#define SPI_CH_RXCH_OFF (0<<1)
#define SPI_CH_RXCH_ON (1<<1)
#define SPI_CH_TXCH_OFF (0<<0)
#define SPI_CH_TXCH_ON (1<<0)
#define SPI_CLKSEL_PCLK (0<<9)
#define SPI_CLKSEL_USBCLK (1<<9)
#define SPI_CLKSEL_ECLK (2<<9)
#define SPI_ENCLK_DISABLE (0<<8)
#define SPI_ENCLK_ENABLE (1<<8)
#define SPI_MODE_CH_TSZ_BYTE (0<<29)
#define SPI_MODE_CH_TSZ_HALFWORD (1<<29)
#define SPI_MODE_CH_TSZ_WORD (2<<29)
#define SPI_MODE_BUS_TSZ_BYTE (0<<17)
#define SPI_MODE_BUS_TSZ_HALFWORD (1<<17)
#define SPI_MODE_BUS_TSZ_WORD (2<<17)
#define SPI_MODE_RXDMA_OFF (0<<2)
#define SPI_MODE_RXDMA_ON (1<<2)
#define SPI_MODE_TXDMA_OFF (0<<1)
#define SPI_MODE_TXDMA_ON (1<<1)
#define SPI_MODE_SINGLE (0<<0)
#define SPI_MODE_4BURST (1<<0)
#define SPI_SLAVE_MAN (0<<1)
#define SPI_SLAVE_AUTO (1<<1)
#define SPI_SLAVE_SIG_ACT (0<<0)
#define SPI_SLAVE_SIG_INACT (1<<0)
#define SPI_INT_TRAILING_DIS (0<<6)
#define SPI_INT_TRAILING_EN (1<<6)
#define SPI_INT_RX_OVERRUN_DIS (0<<5)
#define SPI_INT_RX_OVERRUN_EN (1<<5)
#define SPI_INT_RX_UNDERRUN_DIS (0<<4)
#define SPI_INT_RX_UNDERRUN_EN (1<<4)
#define SPI_INT_TX_OVERRUN_DIS (0<<3)
#define SPI_INT_TX_OVERRUN_EN (1<<3)
#define SPI_INT_TX_UNDERRUN_DIS (0<<2)
#define SPI_INT_TX_UNDERRUN_EN (1<<2)
#define SPI_INT_RX_FIFORDY_DIS (0<<1)
#define SPI_INT_RX_FIFORDY_EN (1<<1)
#define SPI_INT_TX_FIFORDY_DIS (0<<0)
#define SPI_INT_TX_FIFORDY_EN (1<<0)
#define SPI_STUS_TX_DONE (1<<21)
#define SPI_STUS_TRAILCNT_ZERO (1<<20)
#define SPI_STUS_RX_OVERRUN_ERR (1<<5)
#define SPI_STUS_RX_UNDERRUN_ERR (1<<4)
#define SPI_STUS_TX_OVERRUN_ERR (1<<3)
#define SPI_STUS_TX_UNDERRUN_ERR (1<<2)
#define SPI_STUS_RX_FIFORDY (1<<1)
#define SPI_STUS_TX_FIFORDY (1<<0)
#define SPI_PACKET_CNT_DIS (0<<16)
#define SPI_PACKET_CNT_EN (1<<16)
二、重點(diǎn)參數(shù)及初始化步驟
1 雙通道SPI管腳配置
2 傳輸模型配置
/* Set transfer type (CPOL & CPHA set) */
spi_chcfg= SPI_CH_RISING | SPI_CH_FORMAT_A;
spi_chcfg|= SPI_CH_MASTER;
writel(spi_chcfg , spiregs + S3C_CH_CFG);
詳細(xì)請(qǐng)參考:http://blog.csdn.net/hustyangju/article/details/20474659
3 時(shí)鐘配置
使用PCLK,外部時(shí)鐘66M,100分屏:
/* Set clock configuration register
* SPIclockout = clock source / (2 * (prescaler +1))
* PCLK=66Mhz, SPI clockout = clock source /(2 * (prescaler +1)) */
spi_clkcfg= SPI_ENCLK_ENABLE;
spi_clkcfg|= SPI_CLKSEL_PCLK;
writel(spi_clkcfg , spiregs + S3C_CLK_CFG);
spi_clkcfg= readl( spiregs + S3C_CLK_CFG);
spi_clkcfg|= 49; // the least spi speed =660Khz
writel(spi_clkcfg , spiregs + S3C_CLK_CFG);
4 SPI 模塊設(shè)置
/* Set SPI MODE configuration register */
spi_modecfg= SPI_MODE_CH_TSZ_BYTE| SPI_MODE_BUS_TSZ_BYTE;
spi_modecfg|= SPI_MODE_TXDMA_OFF| SPI_MODE_SINGLE| SPI_MODE_RXDMA_OFF;
spi_modecfg&= ~( 0x3f << 5);
spi_modecfg|= ( 0x1 << 5); // Tx FIFOtrigger level in INT mode
spi_modecfg&= ~( 0x3f << 11);
spi_modecfg|= ( 0x1 << 11); // Rx FIFOtrigger level in INT mode
spi_modecfg&= ~( 0x3ff << 19);
spi_modecfg|= ( 0x1 << 19); // Counting ofTailing Bytes
writel(spi_modecfg,spiregs + S3C_MODE_CFG);
設(shè)置在fifo和bus中的數(shù)據(jù)寬度為byte,關(guān)閉DMA訪問(wèn)fifo,并設(shè)置fifo中保存最大字節(jié)數(shù)為1,設(shè)置接收和發(fā)送fifo的觸發(fā)值為1byte。
5 中斷配置
/* SetSPI INT_EN register */
writel(spi_inten,spiregs + S3C_SPI_INT_EN); //u32 spi_inten =0x00
writel(0x1f,spiregs + S3C_PENDING_CLR);
6 設(shè)置最大接收數(shù)據(jù)包數(shù)量
SPI can control the number of packets to bereceived in master mode. If there is any number of packets to bereceived, justset the SFR (Packet_Count_reg). SPI stops generating SPICLK when the number ofpackets is thesame as what you set. It is mandatory to follow software orhardware reset before this function is reloaded.(Software reset can clear allregisters except special function registers, but hardware reset clears allregisters.)
上一篇:ARM程序剖析--ARM程序結(jié)構(gòu),Image文件結(jié)構(gòu)等
下一篇:qt-embedded-linux-opensource-src-4.5.3移植到s3c6410
推薦閱讀最新更新時(shí)間:2025-06-28 05:33



設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來(lái)
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問(wèn)外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- LTC3119IFE 5V、500kHz 寬輸入穩(wěn)壓器的典型應(yīng)用電路
- BPC292封裝的SPC58 C,E,G和N線的微型插座模塊
- FRDM-17C724EVB: Freedom套件 - MPC17C724, 0.4 A雙H橋
- LTC695-3.3 的典型應(yīng)用 - 3.3V 微處理器監(jiān)控電路
- 使用 Analog Devices 的 LTC6263HMS 的參考設(shè)計(jì)
- FSA3000 兩端口高速 MHL 交換機(jī)的典型移動(dòng) MHL 應(yīng)用
- LTC3633AIFE 1.5V 1MHz 雙相降壓穩(wěn)壓器的典型應(yīng)用電路
- NCV33074ADR2G 運(yùn)算放大器用作 LED 驅(qū)動(dòng)器的典型應(yīng)用
- 4463-915-PDK,用于 Si4463 915-MHz 射頻收發(fā)器的 EZRadio-PRO 無(wú)線開發(fā)套件
- CN0313
- Bourns 發(fā)布全新大功率金屬片電流檢測(cè)電阻, 采用 SMD 2010 緊湊型封裝
- 意法半導(dǎo)體推出先進(jìn)的 1600 V IGBT,面向高性價(jià)比節(jié)能家電市場(chǎng)
- EDPF-NT+分散控制系統(tǒng)網(wǎng)絡(luò)防護(hù)解決方案
- 基于PLC控制的易驅(qū)變頻器在布袋除塵器上的應(yīng)用
- 如何利用伺服自動(dòng)化實(shí)現(xiàn)成本降低和產(chǎn)能最大化?
- 壓力傳感器有哪些抗干擾措施?
- 破局!補(bǔ)盲dToF固態(tài)激光雷達(dá)輪番“出手”,禾賽FT120也要靠邊
- 利用正壓送風(fēng)壓力傳感器自動(dòng)控制火災(zāi)風(fēng)口壓力
- 多個(gè)傳感器間相互位置關(guān)系校準(zhǔn)方法
- 樓宇自控BA系統(tǒng)傳感器有哪些?
- STM32開發(fā)筆記2: STM32407 IO輸出的設(shè)置
- TI推出延長(zhǎng)貨架存放期計(jì)劃,最高五年
- STM32開發(fā)筆記3: STM32F407定時(shí)器2-5的使用方法
- STM32開發(fā)筆記4: STM32F407 UART的使用方法
- STM32開發(fā)筆記5: miniUART的使用方法
- 一顆類腦芯片為起點(diǎn),AI企業(yè)西井科技完成新一輪過(guò)億元融
- 三星宣布將推6億像素圖像傳感器
- 重慶一季度集成電路逆勢(shì)增40%,蘋果、惠普增加訂單
- 仙知小課堂|仙知網(wǎng)絡(luò)協(xié)議API使用教程(十六)
- 新專利顯示蘋果汽車可能采用特斯拉式感應(yīng)電動(dòng)機(jī)