假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。
那么第一个上升沿来的时候 数据将会是sdo=1;寄存器=0101010x。下降沿到来的时候,sdi上的电平将所存到寄存器中去,那么这时寄存器=0101010sdi,这样在8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个spi时序。
例子:
假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据
脉冲 | 主机sbuff | 从机sbuff | sdi | sdo |
0 | 10101010 | 01010101 | 0 | 0 |
1上 | 0101010x | 1010101x | 0 | 1 |
1下 | 01010100 | 10101011 | 0 | 1 |
2上 | 1010100x | 0101011x | 1 | 0 |
2下 | 10101001 | 01010110 | 1 | 0 |
3上 | 0101001x | 1010110x | 0 | 1 |
3下 | 01010010 | 10101101 | 0 | 1 |
4上 | 1010010x | 0101101x | 1 | 0 |
4下 | 10100101 | 01011010 | 1 | 0 |
5上 | 0100101x | 1011010x | 0 | 1 |
5下 | 01001010 | 10110101 | 0 | 1 |
6上 | 1001010x | 0110101x | 1 | 0 |
6下 | 10010101 | 01101010 | 1 | 0 |
7上 | 0010101x | 1101010x | 0 | 1 |
7下 | 00101010 | 11010101 | 0 | 1 |
8上 | 0101010x | 1010101x | 1 | 0 |
8下 | 01010101 | 10101010 | 1 | 0 |
这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的名准备数据,主机在下一个8位时钟周期才把数据读回来!!
看大家明白没有!!!!!
-
引用 zhongfc 2006/4/3 13:30:41 发表于2楼的内容
-
引用 mcumao 2006/4/3 13:44:51 发表于3楼的内容
-
-
zhongfc 发表于 2006/4/4 9:14:22
我现在有点明白了,还有些问题想问下
还有一个问题想请教:我以前没有做过开发,对于SCK的精确度很重要吗?像这个输入
SPIIN:SETB P1.1 ;使P1.1(时钟)输出为1
CLR P1.2 ;选择从机
MOV R1,#08H ;置循环次数
SPIIN1:CLR P1.1 ;使P1.1(时钟)输出为0
NOP ;延时
NOP
MOV C,P1.3 ;从机输出SPISO送进位C
RLC A ;左移至累加器ACC
SETB P1.1 ;使P1.1(时钟)输出为1
DJNZ R1,SPIIN1 ;判断是否循环8次(8位数据)
MOV R0,A ;8位数据送R0
RET
P1.1作为SCK我看好像要控制准确的时钟不是很准是吗?
引用 zhongfc 2006/4/4 9:14:22 发表于4楼的内容
-
引用 mcumao 2006/4/4 12:41:12 发表于5楼的内容
-
引用 zsm_76 2006/5/16 21:17:49 发表于6楼的内容
-
引用 zhongfc 2006/5/23 9:54:26 发表于7楼的内容
-
引用 zsm_76 2006/5/23 16:33:28 发表于8楼的内容
-
引用 mcumao 2006/5/26 12:40:42 发表于9楼的内容
-
引用 zhongfc 2006/5/27 8:30:43 发表于10楼的内容
-
引用 zhongfc 2006/5/27 8:32:05 发表于11楼的内容