【数据寄存器】SPI通信协议中文版( 三 )


1.4功能说明
SPI模块允许MCU与外设进行双工同步串行通信 。软件可以轮询SPI状态标识位或可被中断驱动的SPI操作 。
SPI系统通过设置SPI控制寄存器1的SPI使能位(SPE)进行使能 。当SPE位被设置时 , 4个相关的SPI引脚专用于SPI功能:
· 从机选择(SS)
· 串行时钟(SCK)
· 主机输出/从机输入(MOSI)
· 主机输入/从机输出(MISO)
SPI系统的主要元件是SPI数据寄存器 。主机和从机的8位数据寄存器分别连接在MOSI和MISO引脚上形成一个分布式16位寄存器 。当执行数据传输操作时 , 该16位寄存器被主机的S时钟连续移动8位 , 实现主机与从机的数据交换 。写入SPI数据寄存器的数据成为发向从机的输出数据 , 在传输操作完成后从主机SPI数据寄存器读取的数据是来自从机的输入数据 。
先对SPISR进行读取操作(SPTEF = 1)然后将数据写入SPIDR可将数据放入传输寄存器 。当传输完成后 , 接收的数据已被移动到接收数据寄存器 。在下次传输开始前 , 随时可以将数据从该双缓存系统中读出 。对该8位寄存器进行读取 , 该寄存器将作为SPI接收数据寄存器;对该寄存器进行写入 , 该寄存器将作为SPI传输数据寄存器 。一个SPI寄存器地址会用于从读数据缓存器读取数据或向传输数据寄存器写入数据 。
通过SPI控制寄存器1(SPICR1)中的时钟相位控制位(CPHA)和时钟极性控制位(CPOL)对SPI系统使用的4种时钟格式进行选择 。CPOL位选择非倒置或倒置时钟 。CPHA位用于控制在奇数SCK边或偶数SCK边上采样数据 , 以适应两个根本不同的协议(参考1.4.3 传输格式) 。
SPI可以配置为主机或从机 。当SPI控制寄存器1的MSTR位被置1 , 设置为主机模式 , MSTR位清0 , 选择为从机模式 。
1.4.1 主机模式
当MSTR位置1是SPI工作在主机模式 。仅主机的SPI模块可以启动发送 。通过向SPI数据寄存器写入数据可启动传输 。如果位移寄存器为空 , 字节数据会立即传输到位移寄存器 。字节数据在串行时钟的控制下开始从MOSI引脚移出 。
· S-时钟
波特率选择位SPR2、SPR1和SPR0联合SPI波特率寄存器中的波特率预选位SPPR2、SPPR1和SPPR0来控制波特率发生器确定传输速度 。SCK引脚是SPI时钟输出 。通过SCK引脚 , 主机的波特率发生器可以控制从机外设的位移寄存器 。
· MOSI与MISO引脚
在主机模式中 , 串行数据输出脚(MOSI)和串行数据输入脚(MISO)的功能由SPC0和BIDIROE控制位决定 。
· SS引脚
如果MODFEN和SSOE位被置起 , SS脚被配置为从机选择输出 。在传输期间SS输出转为低电平 , SPI为空闲状态时为高电平 。
如果MODFEN被置起 , SSOE被清零 , SS脚配置为输入 , 用来检测模式故障 。在其它主机尝试驱动MOSI和SCK线时 , 如果SS输入转为低电平就表示是模式故障错误 。这种情况下 , SPI将立即切换至从机模式 , 通过清除MSTR位也可以禁用从机输出缓存MISO(或双向模式的SISO) 。因此 , 结果就是所有输出被禁用 , SCK、MOSI和MISO作为输入 。如果模式故障发生时正在进行传输 , 传输被中止并且SPI被强制转为空闲模式 。
该模式故障会置起SPI状态寄存器(SPISR)的模式故障(MODF)标识 。如果MODF标识被设置时 , SPI的中断使能位(SPIE)是置起的 , 就会发起一个SPI中断序列请求 。
在主机模式中 , 当对SPI数据寄存器进行写操作时 , 会有半个SCK周期的延时 。延时过后 , SCK在主机中启动 。根据SPI控制寄存器1的SPI时钟相位位CPHA指定的时钟格式不同 , 位移操作略有不同(参考1.4.3 传输格式) 。
注意
在主机模式中 , 更改CPOL, CPHA, SSOE, LSBFE, MODFEN, SPC0,BIDIROE(SPC0置起时) , SPPR2–SPPR0和SPR2–SPR0将会立即中止当前传输并迫使SPI进入空闲模式 。远程从机是无法检测到这种情况的 , 因此 , 主机必须确保远程从机设置为空闲模式 。


推荐阅读