请教 SPI 通信问题
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|
- UID
- 161144
- 性别
- 男
|
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时钟也没有了
我想应该是发送数据那块出的毛病可是找不到原因 尝试过好多回了.
|
|
|
|
|
|
- UID
- 161144
- 性别
- 男
|
上面的 printp(" AD=%d\n ",a)应该是printp(" AD=%d\n ",data)我传的时候弄错了 |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
你为什么要用printp函数?它生成的代码是怎样的?另外,你也可以参考这个帖子:
http://bbs.eccn.com/dispbbs.asp?boardid=3&rootid=118351&id=118351&star= |
|
|
|
|
|
- UID
- 161144
- 性别
- 男
|
那些都对的
即使不用printp函数结果也是这样啊 ? |
|
|
|
|
|
- UID
- 161144
- 性别
- 男
|
那个例子我看了
我用8位做结果是正确的 用16位就不对了
是不是发送和接收是同时进行
而发送只有8位,接收要16位 中间有个时差的问题呢
我用的是MCU和TLC2543做AD转换的 麻烦版主再帮我看看啊
不胜感激1 |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
DT128的SPI是8位的,如果要于16位的SPI通讯,就需要软件进行一些处理。首先,DT128应连续发送2个字节,才能连续接收16位数据;另外,必须看一下从机的同步方式。如果从机需要用SS进行同步的话,就必须用软件来实现,而不能直接用DT128的SS信号。TLC2543可以采用8位的通讯方式,为何不用呢? |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
建议你还是用16位的SPI通讯。
用一个通用I/O口作为CS信号,并用另一个通用I/O口检测ECO的电平变化。将CS由高变低后,连续输出2个字节,其中第一个字节包含转换地址和格式命令;然后等待ECO的电平变化指示转换完成,再连续输出2个字节的数据(必须保证其数据长度位选为16),此时主机SPI中读入的数据就是需要的转换结果了。如果通讯完成,则将CS信号由低变高即可。
[此贴子已经被strongchen于2007-5-11 17:36:45编辑过] |
|
|
|
|
|
- UID
- 161144
- 性别
- 男
|
是不是 CS选线只在开始传输的时候设置为低,
关闭AD转换系统时将CS给高电平 我试试 谢谢1 |
|
|
|
|
|
- UID
- 161144
- 性别
- 男
|
我试过了 还是不行 数据有问题
我用PB0口控制CS端口 给TLC2543低电平让其工作
我用示波仪观察到的图形是16位的 TLC2543的EOC波形也正常与时钟同步.但是AD输出的数据却不正确我测试的是0电位,输出的结果是0B0000000111110000并不是0X00;
我设置的控制字为SPI0CR1=0XF0;在此情况下每16个时钟后EOC出现一次正常转换(图形正确)
当改为SPI0CR1=0XF4;(输出时钟连续时,其他设置不变)此时每8个时钟出现一次EOC变换(既每8位转换一次了)这是什么原因,我给AD转换发送的控制字都是16位的 而改变控制时钟确改变了传送位数什么原因??
还有,当把同步时钟频率提高后,系统不稳定,输出数据及EOC都不稳定变化
|
|
|
|
|
|
- UID
- 161144
- 性别
- 男
|
请教 SPI 通信问题
[此贴子已经被作者于2007-5-12 14:06:03编辑过] |
|
|
|
|
|
- UID
- 161144
- 性别
- 男
|
我用中断的方式做的,不检验ECO口,通过检测SPI中的SPI0DR是否接受完8位数据,若接受完则会产生中断的方式 进行读取,CS一直为低,因为采样一直在进行是不是也可以呢? |
|
|
|
|
|
- UID
- 161144
- 性别
- 男
|
我试过了 还是不行 数据有问题 我用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编辑过] |
|
|
|
|
|
- UID
- 161144
- 性别
- 男
|
谢谢楼主,我找到原因了.果然是你说的那样.MCU是没8位给一个片选信号,所以应该找另外一个I/O口作为片选信号,使片选信号和AD转换EOC同步就行了.
弄半个月了可算搞定了
不过MCU的SCLK和EOC不太对劲 设置的时钟连续情况下就不是16位时钟一次转换完毕
有时候是8位,有时候是12位 这个还是没弄明白 不过我做的经过反复实验还没有什么问题呵呵 |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|