娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

S3C6410 SPI全雙工讀寫流程分析

發布者:DreamySunset最新更新時間:2024-09-18 來源: cnblogs關鍵字:S3C6410  SPI  全雙工 手機看文章 掃描二維碼
隨時隨地手機看文章

S3C6410 SPI全雙工讀寫流程分析


一、SPI控制器datasheet


1詳細請參考:http://blog.csdn.net/hustyangju/article/details/20474659


2 SPI的所有寄存器都是映射到內核空間的,采用基地址+偏移地址的方式訪問


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)  


二、重點參數及初始化步驟


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

詳細請參考:http://blog.csdn.net/hustyangju/article/details/20474659

3 時鐘配置


使用PCLK,外部時鐘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 模塊設置


/*     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);

 

設置在fifo和bus中的數據寬度為byte,關閉DMA訪問fifo,并設置fifo中保存最大字節數為1,設置接收和發送fifo的觸發值為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 設置最大接收數據包數量

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.)

[1] [2]
關鍵字:S3C6410  SPI  全雙工 引用地址:S3C6410 SPI全雙工讀寫流程分析

上一篇:ARM程序剖析--ARM程序結構,Image文件結構等
下一篇:qt-embedded-linux-opensource-src-4.5.3移植到s3c6410

推薦閱讀最新更新時間:2025-05-20 23:07

s3c6410的UART設備驅動(1)
1、 這段話摘于《設備驅動開發詳解》 在使用串口核心層這個通用串口tty驅動層的接口后,一個串口驅動要完成的主要工作: (1)、定義uart_driver、uart_ops、uart_port等結構體的實例并在適當的地方根據具體硬件和驅動的情況初始化它們,當然具體設備的驅動可以將這些結構體在新定義的xxx_uart_driver、xxx_uart_ops、xxx_uart_port之內。 (2)、在模塊初始化是調用uart_register_driver和uart_add_port注冊UART驅動并添加端口,在模塊卸載時調用uart_unregister_driver和uart_remove_one_port以注銷
[單片機]
<font color='red'>s3c6410</font>的UART設備驅動(1)
S3C6410移植u-boot(一)
步驟1 1、首先下載u-boot( ftp://ftp.denx.de/pub/u-boot ) wget ftp://ftp.denx.de/pub/u-boot/u-boot-latest.tar.bz2 2、解壓到你指定下路徑中 tar -jxvf u-boot-latest.tar.bz2 -C /opt 步驟2 1、進入u-boot- 發布日期 文件夾 cd /opt/u-boot-2011.06/ cd board/samsung/ 2、建立smdk6410文件夾 mkdir smdk6410 3、復制6400文件夾下的所有代碼到6410下 cp -rf smdk6400/* smdk6410 4、進入
[單片機]
深入理解ARM體系架構(S3C6410)---ad轉化實例
本實例是把采集的ad數據轉化后顯示在lcd屏上,在這直接把自己調試好的源碼貼出來 ad轉化器相關代碼: view plain copy print ? void adc_init() { char preScaler = 66500000/2500000 - 1; //PCLK=66M rADCCON = (1 14)|(preScaler 6)|(0 3)|(0 2);//通道AIN0 // rADCCON =0x44c1;//通道AIN0 } int read_adc() { rAD
[單片機]
【51單片機】普通I/O口模擬SPI口C語言程序
89C51系列單片機都不帶SPI口,所在在這種情況下,我們可以模擬SPI口來現實我們要的功能,程序如下: //-----------------------函數聲明,變量定義------------ #include #include sbit SCK=P1^0; // 將p1.0口模擬時鐘輸出 sbit MOSI=P1^1; // 將p1.1口模擬主機輸出 sbit MISO=P1^2; // 將p1.1口模擬主機輸入 sbit SS1=P1^3; // 將p1.1口模擬片選 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; //-------------------
[單片機]
適合工業應用的魯棒SPI/I2C通信
Robust SPI/I2C Communications for Industrial Applications 適合工業應用的魯棒SPI/I2C通信 評估和設計支持 電路評估板 CN0564參考設計板(EVAL-CN0564-ARDZ) 設計和集成文件 原理圖、布局文件、物料清單 電路功能與優勢 對于控制器和外設之間的短距離電路板內連接,串行外設接口(SPI)和Inter-Integrated Circuit (I2C)接口是流行的事實上的通信標準。由于存在廣泛的硬件和軟件支持,SPI和I2C已被傳感器、執行器和數據轉換器制造商廣泛采用。當控制器和外設位于同一電路板上、共享同一接地層且相距
[電源管理]
適合工業應用的魯棒<font color='red'>SPI</font>/I2C通信
SPI串行總線協議
一、SPI接口簡介 SPI(Serial Peripheral interface--串行外設接口)總線系統是一種同步串行外設接口,它可以使MCU與各種外圍設備以串行方式進行通信以交換信息。該接口一般使用4條線:串行時鐘線(SCLK)、主機輸入/從機輸出線(MISO)、主機輸出/從機輸入線(MOSI)和從機選擇線SS。 SPI是一個環形總線結構,由SS(CS)、SCK、SDI、SDO構成,其時序比較簡單,主要是在SCK的控制下,兩個雙向移位寄存器進行數據交換。 主要概括為: 上升沿發送、下降沿接受,高位在前、低位在后; 上升沿到來時,SDO電平將被送到從設備的寄存器中;下降沿到來時,SDI電平將被接收到主設備的
[單片機]
<font color='red'>SPI</font>串行總線協議
LPC1788的spi使用
#ifndef __SPI_H_ #define __SPI_H_ #include common.h #include delay.h // cs p1.21 //sck p1.20 //miso p1.23 //mosi p1.24 #define SPI_CLOCK 12000000 void spi0_select_cs(void); void spi0_disSelect_cs(void); u8 spi0_rw_data(u8 writeByte); void spi0_set_speed(u8 speed); void spi0_init(u8 divide); #endif
[單片機]
ARM平臺嵌入式Linux下SPI設備連接
簡介:在嵌入式ARM平臺設備上,經常有在一個SPI bus上面掛接一個或者多個SPI設備的需求,由于掛載一個設備的情況比較簡單,本文主要就在嵌入式Linux環境下掛載多個SPI設備進行說明。 本文所采用的硬件為Toradex 公司Colibri VF61計算機模塊和開發載板,核心為Cortex-A5和M4異構雙核,這里A5運行Toradex官方發布的Embedded Linux BSP V2.5,M4核心這里不做使用。 本文涉及Toradex發布Embedded Linux源碼下載,Device Tree 定制編譯,相關操作請參考下面文章,本文不做贅述。 http://developer.toradex.com/kno
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 安仁县| 桃园市| 乌拉特后旗| 富阳市| 葫芦岛市| 南丰县| 鄂伦春自治旗| 麻阳| 河北区| 荣昌县| 云和县| 英吉沙县| 连山| 沭阳县| 上思县| 张家口市| 东山县| 贵定县| 青河县| 建昌县| 保靖县| 安塞县| 磐石市| 海盐县| 宁乡县| 威远县| 沾益县| 日喀则市| 齐河县| 盖州市| 安远县| 敦化市| 宜兴市| 石柱| 吴桥县| 博乐市| 绥江县| 邳州市| 思南县| 长泰县| 南川市|