打印

STC12C5A60S2连接sst25VF016b时出现的问题

[复制链接]
2811|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuandm1|  楼主 | 2011-7-22 23:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
改公司原来调好的一个板子,第一次调spi总线,遇到问题弄了两天了,没结果,请教一下大家。unsigned char SpiMasterIO(unsigned char HW_SPI_out) using SPI_REGISTER_BANK
{

unsigned char temp;

unsigned long tmp = 0;

SPDAT = HW_SPI_out;

do

{

temp = SPSTAT & SPI_INT_FLAG;

} while ((tmp < SPI_TIMEOUT)&&(temp != SPI_INT_FLAG));

SPSTAT = 0xc0;

return SPDAT;
}


SPI的发送程序如上面。依照STC的手册上修改的原来的程序,原来怎么也看不懂,这句SPSTAT = 0xc0;感觉把SPIF那一位置成1了,怎么上面还查询是1的时候标示发送完了,后来才弄明白,置1标示把SPIF清0了。当发送完8个脉冲数据后成了1,可以查询。
因为原来对Flash操作的程序是现成的,以为把下面的驱动改一下就可以了,后来写进片子后发现总是在Flash初始化的地方死机,经过调查后,发现死机的位置在下面的程序这里:
void FlashWaitBusy(void) using FLASH_REGISTER_BANK
{

unsigned long tmp_byte = 0;

while ( M_FLASH_COMMAND_TIMEOUT> tmp_byte)

{ // waste time until not busy


if((FlashRDSR() & M_FLASH_COMMAND_SR_BUSY) != M_FLASH_COMMAND_SR_BUSY)

{

if((FlashRDSR() & M_FLASH_COMMAND_SR_BUSY) != M_FLASH_COMMAND_SR_BUSY)

{



return;

}

}


tmp_byte++;

}


}

也就是在读Flash寄存器(发送0x05)后,不能返回值。用示波器看SCK和MOSI都是有波形的,MISO就是没有波形,硬件测量也没啥问题,郁闷

相关帖子

沙发
coody| | 2011-7-23 13:29 | 只看该作者
你用SST网站下一个程序就OK了,我就是用下的改改,兼容软硬件SPI。STC的跑33M,4分频SPI,超过8Mbit/S的速度,也很稳定。读写SD卡也类似。

使用特权

评论回复
板凳
yuandm1|  楼主 | 2011-7-24 07:49 | 只看该作者
驱动应该没有问题,因为原来的板子可以正常使用,我现在换了一个cpu,我感觉是寄存器配置不对。还有,问一下我现在用p1.4引脚作为输出引脚,片选外部的flash。现在就1片flash,所以我就直接把p1.4置0了,这样没问题吧。

使用特权

评论回复
地板
yuandm1|  楼主 | 2011-7-26 21:34 | 只看该作者
找到原因了,第一,把SPCTL 配置为 0xD3;并且将P1口的高四位配置为漏极开路。
原来的我的SPI发送和接受函数如下:
unsigned char SpiMasterIO(unsigned char HW_SPI_out) using SPI_REGISTER_BANK
{
       
        SPI_CS = FALSE;
         SPDAT = HW_SPI_out;
        while (!(SPSTAT & SPI_INT_FLAG));
        SPSTAT |= 0xc0;
        SPI_CS = TRUE;
        return SPDAT;
}
后来把SPI_CS 片选放到发送和接收外面就好了,分析可能是在接受数据的时候,还没有返回SPDAT,就把片选抬高导致 数据不能发出。这样终于调通了。

使用特权

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

本版积分规则

23

主题

177

帖子

1

粉丝