打印
[其他ST产品]

急急急!关于SPI控制寄存器

[复制链接]
5635|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
张杰伦|  楼主 | 2007-6-3 09:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
兄弟用st72f561和stL9950。在设置SPICR寄存器的时候。每次设置的0x5c。程序执行一段时间后便自动变为0x0c。也就是说SPICR的SPE位和MSTR位自动置0。导致单片机的数据无法发送。那位高手指点一下,小弟不胜感激!
沙发
香水城| | 2007-6-3 11:12 | 只看该作者

寄存器的值不可能自己自动改变,只可能被程序改变

还是看看你的程序吧。

使用特权

评论回复
板凳
张杰伦|  楼主 | 2007-6-3 14:49 | 只看该作者

我的初始化程序

void System_ini(void)
{
     
//i/o port initialization
    PADDR=0x3f;
    PFDDR=0x00;
    PEDDR=0xf9;
    PDDDR=0x6c;
    PDDR|=0x01;

        PAOR=0xf0;
    PBOR=0x0f;
    PCOR=0x02;
         PEOR=0xf9;
    
    SPICSR&=0xfd;
    SPICSR|=0x01;
    SPICR=0x5c;
    
    EICR0=0xaa;
    ARTCSR=0x7a;
    ARTARR=0x01;
}
在执行这段程序的时候每次想往控制寄存器SPICR里写5c.结果每次都是0c.真郁闷了.

使用特权

评论回复
地板
8bit_mcu| | 2007-6-5 17:29 | 只看该作者

回答

SPICSR &= 0xfd; 将ssm位清0,表示有外部信号控制SS引脚来决定是master还是slave.

SPICSR |= 0x01; 将SSI位置1,此位只有在SSM位为1时才有效,不知道你到底是要用内部软件来选择还是用外部引脚来选择。

此时如果你外部引脚配置不当,则会出现模式错误,一旦发生模式错误,spe位和MSTR位就会被自动清0。所以才出现自动变成0C的结果。

使用特权

评论回复
5
张杰伦|  楼主 | 2007-6-6 08:36 | 只看该作者

回复8_bitMCU

用外部引脚控制,是不是固定接高电平。我的电路没有接选择的是内部软件来选择的。我的初始化程序
void System_ini(void)
{
    PADDR=0x3f;
    PFDDR=0x00;
    PEDDR=0xf9;   //11111001
    PDDDR=0x6c;
    
    PAOR=0xf0;
    PBOR=0x0f;
    PCOR=0x02;
    PEOR=0xf9;
    
    SPICSR&=0xfb;
    SPICSR|=0x03;
    SPICR=0x5c;
    EICR0=0xaa;
    ARTCSR=0x7a;
    ARTARR=0x01;
}  
现在我遇到的问题是:每次向l9950写数据只能写一次,再写就会出现错误了。是不是初始化,还有什么错误?
你能帮我看看吗!小弟最近要结题验收了,十分着急!
如果可以,我把程序发给你。

使用特权

评论回复
6
8bit_mcu| | 2007-6-6 09:28 | 只看该作者

还是有问题的

你的要求到底是什么,我看你现在配的,还是用软件来配置master/slave,但是你又说你要用外部引脚来配置。你现在配置的是软件选择作为MASTER使用,应该也问题不大。

再写的时候出现什么错误啊,你发送完以后,有没有去清标志位?

最好还是把DATASHEET好好看看,上面初始化的步骤,以及发送/接收的步骤都写得很详细的。

使用特权

评论回复
7
8bit_mcu| | 2007-6-6 10:16 | 只看该作者

继续

l9950不是很了解,刚才看了一眼,好像是根据接收到的第一位来判断放在哪一个寄存器中。

MCU作为主设备发送时是先发高位的,看看你是不是用高位来选择放在哪一个寄存器中的呢?

我们这里不能用聊天软件!

使用特权

评论回复
8
张杰伦|  楼主 | 2007-6-6 10:23 | 只看该作者

。。

很感激你还特地看了 下L9950。
你说的对。是根据第一位来选择放到那个寄存器的。我也知道MCU作为主设备发送时是先发高位的,这样也就是说先发的最高位放到第一位,是吗。这里应该没错,因为第一次发送的是正确的啊!郁闷了。

使用特权

评论回复
9
8bit_mcu| | 2007-6-6 10:28 | 只看该作者

继续

你用示波器看过么,从MCU发送出去的数据是不是跟你程序里面设的一样,如果一样的话,那也就是说mcu这里没有问题,或者是你对l9950的理解有问题,具体的要你自己查一下了。

如果mcu发送出去的数据和你实际要发的不一致,我们还可以帮你看看。

使用特权

评论回复
10
张杰伦|  楼主 | 2007-6-6 10:35 | 只看该作者

我再研究下。

我再研究下,看看到底什么问题。会不会是在发送的时候出现有一位错误,使得本来发送到寄存器1的发到了寄存器0啊!和时钟一有关系吗?CPHA和CPOL的设置有关吗。我在仔细看看。 实在不行,你能帮我看看程序吗?总之十分感谢你了。你是st公司的吗?还是?呵呵,谢了

使用特权

评论回复
11
mcu_auto| | 2007-6-6 10:50 | 只看该作者

一点建议

对于L9950来讲,要设置CPOL=0,CPHA=0;而且L9950的SPI是低位先发的,而MCU是高位先发,所以你可能要注意一下你发送的顺序。
希望对你的调试有帮助。

使用特权

评论回复
12
张杰伦|  楼主 | 2007-6-7 07:35 | 只看该作者

还是没有解决问题

又仔细看了一遍,还是没进展。第一次写数据的时候,状态是对的。然后第二次再写的时候,L9950的输出全部变高了。  如果在第一次写完数据之后单片机复一下位,再写数据就是对的。   谁知道,能让L9950输出全变高有哪些原因吗?

使用特权

评论回复
13
张杰伦|  楼主 | 2007-6-7 07:38 | 只看该作者

谁能帮我看看程序?

小弟实在是黔驴技穷了。不知道到底出了什么原因,那位帮我看看我的程序。如果有我就发上去了。  

使用特权

评论回复
14
mcu_auto| | 2007-6-7 09:29 | 只看该作者

继续

不知道你的L9950的负载是什么,只有出现错误,输出的状态才会是"1"
,比如过流,空载等等,而有的错误会将相应的驱动关掉,不能自动恢复,你再查查输出状态,看看是什么错误吧

使用特权

评论回复
15
8bit_mcu| | 2007-6-7 09:29 | 只看该作者

用示波器看一下

有没有用示波器看看,第二次从MCU发送的数据是不是正确呢?如果跟你设定要发的数据一样,那么就是你自己要发送的东西不对,如果mcu发出的数据不是你想法的,那么就是软件问题。你先要排除到底是哪部分的问题才是。还有看看你第二次发送数据前相关寄存器清了没有?

使用特权

评论回复
16
张杰伦|  楼主 | 2007-6-7 09:33 | 只看该作者

是读状态寄存器吗

本来是控制电机的 但电机临时没接 如果不接负载会出现你说的情况吗

使用特权

评论回复
17
张杰伦|  楼主 | 2007-6-7 09:36 | 只看该作者

昨天用示波器看了

昨天用示波器看了的.但我真不知道那数据怎么看.偶尔出现个高低电平,也不知道怎么验证是不是对的.555!  要发三个8位的一共24位!  

使用特权

评论回复
18
8bit_mcu| | 2007-6-7 09:41 | 只看该作者

示波器还要我教阿

这不是很简单的么,调好单位时间,示波器用单步触发,抓下一屏数据,拉开度一下不就可以了。

使用特权

评论回复
19
张杰伦|  楼主 | 2007-6-7 09:46 | 只看该作者

见谅

这也许就是高手和菜鸟的区别吧,见谅了.我再研究下.

使用特权

评论回复
20
8bit_mcu| | 2007-6-7 09:50 | 只看该作者

还有,

15楼说的可能性也蛮大的,l9950我不熟,你最好把平台搭完整再试。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

25

帖子

1

粉丝