以上的代码是初始化函数里完成的,一旦初始化函数正确运作,就可以采取正确的步骤进行SPI口通信了。以上初始化完之后,要调用cpm_install_handler函数,该函数的作用是把中断函数注册进内核,一旦SPI口产生硬件中断,就调用中断函数,中断函数的编写可以依据不同系统的不同需要,在本例中,我们使得一旦调用中断函数,就读取SPI接收到的数据。
接下来以怎么样发送数据为例,分析怎么样操作SPI口通信。
发送数据的步骤
在此例中,设SPI接口为主模式。为了开始数据传送过程,内核把要传送的数据写到一个数据缓冲区,然后配置缓冲区描述符,以达到传送的目的。以下给出发送数据的一段代码,通过代码解释传输的过程。
memset((void*)txbuffer,0,2);/*清空buffer*/
tbdf->cbd_sc = BD_SC_READY | BD_SC_LAST | BD_SC_WRAP;
tbdf->cbd_datlen = 2;
/*设置发送缓冲区的状态控制寄存器的值和发送数据的个数*/
rbdf->cbd_sc = BD_SC_EMPTY | BD_SC_WRAP;
rbdf->cbd_datlen = 0;
/*由于并不打算接受数据,所以个数为0*/
cp->cp_spmode = 0x777f;
cp->cp_spie = 0xff;
cp->cp_spim = 0x37;
/*设置SPI接口寄存器的值,以便发送数据,设置SPI接口的
主或从模式必须在发送函数里设置,否则的话,不能发送数据*/
cp->cp_spcom |= 0x80;/*开始发送数据*/
udelay(1000);/*必须得等待,否则的话不能正确读到缓冲区状态控制寄存器的值*/
if((tbdf->cbd_sc & 0x8000))
printk(" spi write error !");
memset((void*)rxbuffer,0,2);
|
数据通信过程中,最重要的是时序,正确的时序要通过反复的实验才能得到。图3是在实验过程中得到的逻辑图(安捷伦公司的1672G逻辑分析仪测试结果)。其中,CS是片选信号,CK是时钟信号,DO是823e发送的数据。可以使用逻辑分析仪来阅读得到的数据是否和设备发送的数据一致。正确的通信必须经过长时间的调试才能够取得。
根据ADS7846的使用手册,驱动程序必须在初始化的时候与ADS7846建立通信。所以,823e首先要向ADS7846发送命令,得到ADS7846的回复后建立通信。驱动程序调用SPI的读写函数来实现对ADS7846的操作。
共2页: 上一页 [1] 2 下一页
|