首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

请教  SPI 通信问题

什么芯片?
海纳百川  有容乃大
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时钟也没有了
我想应该是发送数据那块出的毛病可是找不到原因 尝试过好多回了.
上面的 printp(" AD=%d\n ",a)应该是printp(" AD=%d\n ",data)我传的时候弄错了
你为什么要用printp函数?它生成的代码是怎样的?另外,你也可以参考这个帖子:

http://bbs.eccn.com/dispbbs.asp?boardid=3&rootid=118351&id=118351&star=
海纳百川  有容乃大
那些都对的
即使不用printp函数结果也是这样啊 ?
那个例子我看了 
我用8位做结果是正确的 用16位就不对了
是不是发送和接收是同时进行 
而发送只有8位,接收要16位 中间有个时差的问题呢
我用的是MCU和TLC2543做AD转换的 麻烦版主再帮我看看啊
不胜感激1
DT128的SPI是8位的,如果要于16位的SPI通讯,就需要软件进行一些处理。首先,DT128应连续发送2个字节,才能连续接收16位数据;另外,必须看一下从机的同步方式。如果从机需要用SS进行同步的话,就必须用软件来实现,而不能直接用DT128的SS信号。TLC2543可以采用8位的通讯方式,为何不用呢?
海纳百川  有容乃大

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

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

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

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

请教&nbsp;&nbsp;SPI&nbsp;通信问题

 

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

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

我试过了 还是不行 数据有问题
我用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编辑过]

谢谢楼主,我找到原因了.果然是你说的那样.MCU是没8位给一个片选信号,所以应该找另外一个I/O口作为片选信号,使片选信号和AD转换EOC同步就行了.
弄半个月了可算搞定了
不过MCU的SCLK和EOC不太对劲 设置的时钟连续情况下就不是16位时钟一次转换完毕
有时候是8位,有时候是12位 这个还是没弄明白 不过我做的经过反复实验还没有什么问题呵呵
不太明白你的意思。什么是时钟连续的情况?
海纳百川  有容乃大
返回列表