Board logo

标题: 请教  SPI 通信问题 [打印本页]

作者: strongchen    时间: 2007-5-10 09:59

什么芯片?
作者: 165198646    时间: 2007-5-10 16:34

unsigned int AD[2],data;
unsigned char i=0,RE;
void main(void) {

SPI0BR=0x77; //设置SPI通信时钟
SPI0CR1=0Xde; //打开SPI通信 允许接收完中断
SPI0DR=0X0C; //发送的数据 告诉从机发送16位数据

while(1){
printp(" AD=%d\n ",a); //显示16位数据
}
}

interrupt void SPI_interrupt(void){ //中断函数 发生则说明接受完8位数据
if(SPI0SR_SPTEF==1){ //告诉从机发送16位数据
SPI0DR=0X0C;
}
RE=SPI0SR_SPIF ;
AD[i++]=SPI0DR;
if(i>=2){
i=0;
data=(AD[0]<<4)+(AD[1]>>4); //data为16位数据
}
}

我用的是MC9SDT128B
我测试过了 只接受了一次数据 后来就不接受数据了 SPI时钟也没有了
我想应该是发送数据那块出的毛病可是找不到原因 尝试过好多回了.

作者: 165198646    时间: 2007-5-10 16:35

上面的 printp(" AD=%d\n ",a)应该是printp(" AD=%d\n ",data)我传的时候弄错了
作者: strongchen    时间: 2007-5-10 17:07

你为什么要用printp函数?它生成的代码是怎样的?另外,你也可以参考这个帖子:

http://bbs.eccn.com/dispbbs.asp?boardid=3&rootid=118351&id=118351&star=
作者: 165198646    时间: 2007-5-10 18:31

那些都对的
即使不用printp函数结果也是这样啊 ?
作者: 165198646    时间: 2007-5-10 18:37

那个例子我看了 
我用8位做结果是正确的 用16位就不对了
是不是发送和接收是同时进行 
而发送只有8位,接收要16位 中间有个时差的问题呢
我用的是MCU和TLC2543做AD转换的 麻烦版主再帮我看看啊
不胜感激1
作者: strongchen    时间: 2007-5-11 10:17

DT128的SPI是8位的,如果要于16位的SPI通讯,就需要软件进行一些处理。首先,DT128应连续发送2个字节,才能连续接收16位数据;另外,必须看一下从机的同步方式。如果从机需要用SS进行同步的话,就必须用软件来实现,而不能直接用DT128的SS信号。TLC2543可以采用8位的通讯方式,为何不用呢?
作者: strongchen    时间: 2007-5-11 17:36

建议你还是用16位的SPI通讯。

用一个通用I/O口作为CS信号,并用另一个通用I/O口检测ECO的电平变化。将CS由高变低后,连续输出2个字节,其中第一个字节包含转换地址和格式命令;然后等待ECO的电平变化指示转换完成,再连续输出2个字节的数据(必须保证其数据长度位选为16),此时主机SPI中读入的数据就是需要的转换结果了。如果通讯完成,则将CS信号由低变高即可。

[此贴子已经被strongchen于2007-5-11 17:36:45编辑过]


作者: 165198646    时间: 2007-5-11 22:21

是不是 CS选线只在开始传输的时候设置为低,
关闭AD转换系统时将CS给高电平 我试试 谢谢1
作者: 165198646    时间: 2007-5-12 14:05

我试过了 还是不行 数据有问题
我用PB0口控制CS端口 给TLC2543低电平让其工作
我用示波仪观察到的图形是16位的 TLC2543的EOC波形也正常与时钟同步.但是AD输出的数据却不正确我测试的是0电位,输出的结果是0B0000000111110000并不是0X00;
我设置的控制字为SPI0CR1=0XF0;在此情况下每16个时钟后EOC出现一次正常转换(图形正确)
当改为SPI0CR1=0XF4;(输出时钟连续时,其他设置不变)此时每8个时钟出现一次EOC变换(既每8位转换一次了)这是什么原因,我给AD转换发送的控制字都是16位的 而改变控制时钟确改变了传送位数什么原因??
还有,当把同步时钟频率提高后,系统不稳定,输出数据及EOC都不稳定变化

作者: 165198646    时间: 2007-5-12 14:06     标题: 请教  SPI 通信问题

 

[此贴子已经被作者于2007-5-12 14:06:03编辑过]


作者: 165198646    时间: 2007-5-12 14:12

我用中断的方式做的,不检验ECO口,通过检测SPI中的SPI0DR是否接受完8位数据,若接受完则会产生中断的方式 进行读取,CS一直为低,因为采样一直在进行是不是也可以呢?
作者: 165198646    时间: 2007-5-13 10:34

我试过了 还是不行 数据有问题
我用PB0口控制CS端口 给TLC2543低电平让其工作
我用示波仪观察到的图形是16位的 TLC2543的EOC波形也正常与时钟同步.但是AD输出的数据却不正确我测试的是0电位,输出的结果是0B0000000111110000并不是0X00;
我设置的控制字为SPI0CR1=0XF0;在此情况下每16个时钟后EOC出现一次正常转换(图形正确)
当改为SPI0CR1=0XF4;(输出时钟连续时,其他设置不变)此时每8个时钟出现一次EOC变换(既每8位转换一次了)这是什么原因,我给AD转换发送的控制字都是16位的 而改变控制时钟确改变了传送位数什么原因??
还有,当把同步时钟频率提高后,系统不稳定,输出数据及EOC都不稳定变化

 

 

[此贴子已经被作者于2007-5-13 10:34:34编辑过]


作者: 165198646    时间: 2007-5-13 15:15

谢谢楼主,我找到原因了.果然是你说的那样.MCU是没8位给一个片选信号,所以应该找另外一个I/O口作为片选信号,使片选信号和AD转换EOC同步就行了.
弄半个月了可算搞定了
不过MCU的SCLK和EOC不太对劲 设置的时钟连续情况下就不是16位时钟一次转换完毕
有时候是8位,有时候是12位 这个还是没弄明白 不过我做的经过反复实验还没有什么问题呵呵
作者: strongchen    时间: 2007-5-14 10:49

不太明白你的意思。什么是时钟连续的情况?
作者: 165198646    时间: 2007-5-14 17:28

设置CPHA=1时 出现的是8位转换不是16位转换了
作者: strongchen    时间: 2007-5-15 10:37

CPHA是用于选择SPI的时钟相位的,并不是用于控制时钟连续或数据位数等。TLC2543的SPI通讯格式应该要求采用CPHA=0的方式,即用CS启动SPI通讯,用时钟的前沿同步数据。
作者: 165198646    时间: 2007-5-19 22:08

可是每八个时钟就会有一个断续情况,对十六位数据数据传输有影响啊1

[此贴子已经被作者于2007-5-19 22:08:29编辑过]

[此贴子已经被作者于2007-5-19 22:08:44编辑过]


作者: 165198646    时间: 2007-5-20 13:08

还是上次的TLC2543的SPI通讯.经过我调试上回对了 可过几天我在用又出问题了
我是用SPI口三个口即SCK MISO MOSI 和一个通用I/O口作为片选信号
我在SPI中断中加入片选 即读完16位数据后给一个片选高电平后延时10us再给个低电平
SPI设置为如下:
SPI0BR=0x27;
SPI0CR2=0X00;
SPI0CR1=0Xd0;
SPI0DR=0x0c;
为什么我读的16位数据不准确 有变话而且在改变延时后输出的电压值变化不同有时候是以16为一个单位递增
我读数据函数如下:
interrupt void SPI_interrupt(void){
AD=SPI0SR; //读状态寄存器
SPI0DR=0X0C; //发送寄存器付值
AD[i++]=SPI0DR; //分两次读接收数据
if(i>=2){ //如果接收到16位
i=0;
recdata=((AD[0]<<4)&0x0ff0)|((AD[1]>>4)&0x000f); //转换为12位数据
PORTB_BIT0=1; //控制片选信号
delay_10us();
PORTB_BIT0=0;
}
}
我用的是HCS12DG128
请问一下我出错的问题在哪里??
作者: strongchen    时间: 2007-5-21 10:32

你应该先将TLC2543的输入固定,使它产生固定的输出值,再来判断SPI通讯是否有问题。要仔细用示波器看一下各个信号,特别是CS与时钟信号之间的相位关系是否正确。
作者: 165198646    时间: 2007-5-21 19:05

感谢版主,我试试




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0