1. 内部总线接口: SPI是APB总线上的Slave模块。
2. SPI总线接口及时序
3. PDC DMA控制寄存器
4.
----------------------------
一、 SPI端口初始化
1、 配置PMC(电源管理控制器)
PMC提供5种时钟:(1)MCK(主机时钟),用于AIC或存储控制器及所有外设
(2)PCK(处理器时钟)
(3)外设时钟,提供给内置外设,如USART、SSC、SPI、TWI等
(4)UDPCK,供USB器件使用
(5)PCKx引脚驱动的可编程时钟输出
修改PMC_PCER使能相应的外设时钟,我这里用到AT91C_ID_PIOA和AT91C_ID_SPI1,分别对应Bit[2]和Bit[5]。
2. 配置PIO
SPI需要4根线:NPCS, SPCK, MISO, MOSI,分别设置AT91C_BASE_PIOA的PIO_ASR和PIO_PDR寄存器,使能外设控制这些引脚。
3、配置SPI端口
(1)写SPI_CR软复位SPI
(2)写SPI_MR模式寄存器配置,这里要注意NPCSx,要和真正使用的CS片选口一致。我这里用到NPCS2,直接与外设相连,对应的PCS位置成0xb(x011)
(3)配置相应的SPI_CSR寄存器
(4)写SPI_CR使能该SPI
以上配置结束后,该SPI口应该就可以查询SPI_SR状态寄存器进行正常读写了,或者用AIC来中断控制SPI的读写。
可以将MISO和MOSI短接,回环发送、接收数据以验证SPI是否正常工作。
对SD卡的驱动主要有初始化、读、写、擦除等。
1、 初始化 步骤:
(1) 延时至少74clock
(2) 发送CMD0,需要返回0x01,进入Idle状态
(3) 循环发送CMD55+ACMD41,直到返回0x00,进入Ready状态。
如果是MMC,此步应发送CMD1。
2、 读 步骤:
(1) 发送CMD17(单块)或CMD18(多块)读命令,返回0x00
(2) 接收数据开始令牌0xfe(或0xfc) + 正式数据512Bytes + CRC 校验2Bytes
默认正式传输的数据长度是512Bytes,可用CMD16设置。
3、 写 步骤:
(1) 发送CMD24(单块)或CMD25(多块)写命令,返回0x00
(2) 发送数据开始令牌0xfe(或0xfc) + 正式数据512Bytes + CRC校验2Bytes
4、 擦除 步骤:
(1) 发送CMD32,跟一个参数来指定首个要擦出的扇区号(SD手册上说是块号)
(2) 发送CMD33,,指定最后的扇区号
(3) 发送CMD38,擦除指定区间的扇区
此3步顺序不能颠倒。
还要注意发送CMD命令时,后面要跟一个字节的CRC校验数据,总之要保证每次发送的数据包长度符合协议要求,命令、数据符合时序要求。
===========================
我觉得问题还没有弄清楚,以NSS0为例子.
首先:NSS0可以影射到三根引脚:GPG2,GPE3,GPD15.
然后看2410对SPI的一些描述:
(1)SPI接口描述
SPIMISO[1:0]- IO- SPIMISO is the master data input line, when SPI is configured as a master. When SPI is configured as a slave, these pins reverse its
role.
SPIMOSI[1:0] -IO -SPIMOSI is the master data output line, when SPI is configured as a master. When SPI is configured as a slave, these pins reverse
its role.
SPICLK[1:0] -IO -SPI clock
nSS[1:0] -I -SPI chip select(only for slave mode),这里说只针对从机模式.
(2)状态寄存器的Multi Master Error Flag描述
This flag is set if the nSS signal goes to active low while
the SPI is configured as a master, and SPPINn's ENMUL bit is multi master errors detect mode. MULF is cleared by reading SPSTAn.
0 = not detect, 1 = multi master error detect
(3)SPI PIN CONTROL REGISTER寄存器描述
When the SPI system is enabled, the direction of pins, except nSS pin, is controlled by MSTR bit of SPCONn register. The direction of nSS pin is always
input.(这里说NSS永远作为输入)
When the SPI is a master, nSS pin is used to check multi-master error, provided the SPPIN's ENMUL bit is active, and another GPIO should be used to
select a slave.(这里说要选择另外一个GPIO来选择从机,那NSS0影射到哪个引脚?)
If the SPI is configured as a slave, the nSS pin is used to select SPI as a slave by one master.
其中的Multi Master error detect Enable (ENMUL)标志描述:
The /SS pin is used as an input to detect multi master error when the SPI system is a master.
0 = disable (general purpose)
1 = multi master error detect enable
接着:如果做为从机,这点很好理解.按照SPI协议,肯定要有/SS引脚.这时,NSS0可以影射到3根引脚的任何一根作为NSS0输入.(这里有个疑问,如果把
3根引脚同时影射为NSS0会有什么结果?)
最后:如果作为主机,NSS0影射到哪个引脚?是不是有以下几种情况:
(1)选择一根GPIO线做输出(不包括上面提到的可以影射到NSS0的三根引脚:GPG2,GPE3,GPD15),连接到从机的/SS,这时,普通GPIO根
本不能检测多主机冲突.
(2)从机的/SS管脚总是接低电平,主机没有任何引脚输出来选择从机,这种情况应该也是可以.
(3)选择可以影射到NSS0的三根引脚之一:GPG2,GPE3,GPD15,但这里不影射为/SS,只作普通GPIO,作为从机的/SS输入,这时是不是也不
能检测多主机冲突?
(4)选择可以影射到NSS0的三根引脚之一:GPG2,GPE3,GPD15,而且是配置为/SS功能,作为输出来控制从机的/SS引脚.这种情况有很多疑问:
作为主机,哪根引脚可以作为输出来控制从机的/SS,GPG2,GPE3,GPD15能不能用来做这种功能?检测多主机冲突要求S3C2410与从机怎么个连接方法?
特别是第(4)种情况,总觉得跟数据手册说的很多出入.
看看AVR单片机的描述,比较清楚,但疑问,就是SS配置为输出,能不能检测到多主机冲突?它这里说配置为输入时可以检测.
SS 引脚的功能
从机模式:当SPI 配置为主机时,从机选择引脚SS 总是为输入。SS 为低将激活SPI 接口,MISO成为输出( 用户必须进行相应的端口配置) 引脚,其他引脚成为输入引脚。当
SS 为高时所有的引脚成为输入, SPI 逻辑复位,不再接收数据。SS引脚对于数据包/字节的同步非常有用,可以使从机的位计数器与主机的时钟发生器同步。当SS 拉高时SPI从机
立即复位接收和发送逻辑,并丢弃移位寄存器里不完整的数据。
主机模式:当SPI 配置为主机时(MSTR 的SPCR 置位),用户可以决定SS 引脚的方向。若SS 配置为输出,则此引脚可以用作普通的I/O 口而不影响SPI 系统。典型应用是用来
驱动从机的SS 引脚。如果SS 配置为输入,必须保持为高以保证SPI 的正常工作。若系统配置为主机,SS 为输入,但被外设拉低,则SPI 系统会将此低电平解释为有一个外部主机
将自己选择为从机。为了防止总线冲突, SPI 系统将实现如下动作:
1. 清零SPCR 的MSTR 位,使SPI 成为从机,从而MOSI 和SCK 变为输入。
2. SPSR 的SPIF 置位。若SPI 中断和全局中断开放,则中断服务程序将得到执行。因此,使用中断方式处理SPI 主机的数据传输,并且存在SS 被拉低的可能性时,中断服务
程序应该检查MSTR 是否为"1”。若被清零,用户必须将其置位,以重新使能SPI 主机模式。
还请啊南和大家多多指教
=====================
1. 内部总线接口: SPI是APB总线上的Slave模块。
2. SPI总线接口及时序
3. PDC DMA控制寄存器
4.
阅读(1315) | 评论(0) | 转发(0) |