原创 C8051F236中的3-wire接口

2010-8-20 18:01 2382 11 11 分类: MCU/ 嵌入式

用C8051F236单片机控制ADF4113HV,其中使用的是3-wire接口。3-wire接口包括:CLK、DATA、LE。时序如下:


207dce2a-da5f-4a8d-bdcb-cf0b328a2fc4.jpg


如若多个ADF4113HV的芯片,可在各个芯片中加入片选端/CS。


用单片机实现3-wire时序,首先确定CLK,DATA,LE的物理连接接在C8051F236的普通IO口上。如,将CLK接在P2.6,DATA接在P2.5,LE接在P2.4上。上图中所示的各个时间参数标准可参照芯片手册,然后推算出时钟频率、数据传送速率等,再由单片机产生相应的时序波形。以下按照上面的假设,KeilC下的C语言程序实现。


此处先说明使用#define编写函数与直接使用函数的区别。


如上图中LE信号作为选中信号,将LE拉低,可如下两种方式编写函数:


1. #define    ADF4113_Select1()          LE4113 = 0      


2.void  ADF4113_Select1(void)


{


            LE4113 = 0;


}


很明显第一种方式在C语言层面上编写较为简洁,其实在汇编层面也一样较为简单。虽然在调用情况及C语言编写上看起来1中的ADF4113_Select1()是个函数,其实它是个#define语句,只是一个预编译,一个替代语句。有个小插曲,开始的时候将1的语句写成:


1. #define    ADF4113_Select1()          LE4113 = 0       ;


只是多了个分号,可是当在调用这个“函数”的时候只能写成ADF4113_Select1(),如果在调用时写成了ADF4113_Select1()则报错。这让人思维上一时间会想不通,为什么函数调用的时候不用分号结束呢?其实严格来说它不是个函数,只是一个替代字符串,将这个语句替代了用ADF4113_Select1()这个字符串来表示罢了。这样理解就很容易想通了,ADF4113_Select1()代表的是LE4113 = 0;它是带分号的,所以不再需要分号了。


而2这种方式,虽然只有一个语句,但还是一个函数,在编译成汇编后,后面还是会有个RET命令。


下面介绍单片机下3-wire接口的控制。


首先,实现CLK,DATA,LE三个物理接口的跳变控制。


b53026e5-2a4f-4476-bcc2-00424835e6a2.jpg


然后,实现单个字节的通讯。


382b8d9b-f4bc-4911-aebb-5606eb0cfc6d.jpg


再根据ADF4113芯片,实现一条命令的写入。


dd86ad82-dc37-449f-a544-9e2a59fa366c.jpg

文章评论0条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /2 下一条