写操作必须先将数据准备在数据总线上,等待数据稳定之后,MCU产生一个边沿信号,写入数据到器件。从图中可以看出,在起始状态,数据总线上准备数据,稳定后遇到上升沿MCU将数据写入到器件。写完之后,数据总线上出现第二位数据A0,等待其稳定之后,MCU产生一个上升沿将A0写入器件。
OK,总结完毕,可以简单理解为“写稳(数据稳)读变(时钟变化)”。MCU在数据总线上的数据稳定之后,检测边沿信号写数据到器件;MCU发出边沿信号告诉器件发送数据,检测到边沿信号之后,器件改变(更新)数据,等待稳定之后MCU读取数据。
对照上面的时序图写驱动函数:
- /*
- ** 函 数:single_byte_read
- ** 参 数: unsigned char commd--读之前必须写入的命令
- ** 返回值: unsigned char tempbyte--读取的1byte数据
- ** 说 明: 这只是一个例子函数,对应上面的时序图所写的完整的读1字节数据函数
- */
- unsigned char single_byte_read(unsigned char commd)
- {
- int i;
- unsigned char tempbit;
- unsigned char tempbyte;
- /* 初始化*/
- CE = 0;
- SCLK_OFF;
- /* 写1byte 数据(R/W,addr,R/C,1):读的地址命令*/
- /* 数据总线上先准备好数据,上升沿写入数据到器件*/
- for(i=0;i<8;i++)
- {
- if(commd & 0x01)
- DataIO = 1; //数据总线上准备数据1
- else
- DataIO = 0; //数据总线上准备数据0
- commd=commd>>1;
- SCLK_ON; //上升沿来临,MCU将数据写入器件
- _NOP();
- SCLK_OFF; //再次拉低,为下一个数据提供上升沿条件
- }
- /*写完命令之后, 从器件读1byte数据*/
- /*下降沿通知器件更新数据,等待其稳定之后读取数据*/
- for(i=0;i<8;i++)
- {
- if(DataIO) //紧接上面写命令的最后一个信号是下降沿信号,故此时第一位数据即是器件更新数据
- tempbit = 0x80;
- else
- tempbit = 0;
- tempbyte = tempbyte >> 1 | tempbit;
- SCLK_ON; //上升沿,为下降沿提供条件
- _NOP();
- SCLK_OFF; //下降沿来临,通知器件更新数据,在下一个循环中MCU读取更新的数据.
- }
- return tempbyte;
- }
- /*
- ** 函 数:single_byte_write
- ** 参 数: unsigned char commd--写数据之前必须先写命令
- ** unsigned char data--写的1byte数据
- ** 返回值: none
- ** 说 明: 这只是一个例子函数,对应上面的时序图所写的完整的写1字节数据函数
- */
- void single_byte_write(unsigned char commd,unsigned char data)
- {
- int i;
-
- /* 初始化*/
- CE = 0;
- SCLK_OFF;
- /* 写1byte 数据(R/W,addr,R/C,1):读的地址命令*/
- /* 数据总线上先准备好数据,等待其数据稳定之后,MCU产生一个上升沿写入命令到器件*/
- for(i=0;i<8;i++)
- {
- if(commd & 0x01)
- DataIO = 1; //数据总线上准备数据1
- else
- DataIO = 0; //数据总线上准备数据0
- commd=commd>>1;
- SCLK_ON; //上升沿来临,MCU将数据写入器件
- _NOP();
- SCLK_OFF; //再次拉低,为下一个数据提供上升沿条件
- }
- /*写完1byte命令之后, 再写1byte数据*/
- /*与写命令是一样的,数据总线上先准备好数据,等待其数据稳定之后,MCU产生一个上升沿信号将数据写入*/
- for(i=0;i<8;i++)
- {
- if(data & 0x01)
- DataIO = 1; //数据总线上准备数据1
- else
- DataIO = 0; //数据总线上准备数据0
- data=data>>1;
- SCLK_ON; //上升沿来临,MCU将数据写入器件
- _NOP();
- SCLK_OFF; //再次拉低,为下一个数据提供上升沿条件
- }
- }