打印

正在搞用SPI口进行c8051f060与AT450DB041B的读写(不断更新进展)

[复制链接]
10069|59
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
蓝色日出|  楼主 | 2007-10-19 01:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
正在搞用SPI口进行c8051f060与AT450DB041B之间的读写。
去年参加工作,今天领导终于给一个比较难的任务,用SPI口进行c8051f060与AT450DB041B之间的读写。现在已经连好硬件,同时看相关的寄存器,以前从来没有过这样给CPU配程序,现在没有什么头绪。不知道接下来该如何进行。请各位大侠指点一下!谢谢了!:)

相关帖子

沙发
fsaok| | 2007-10-19 07:25 | 只看该作者

接着下来就在论坛上发帖

等着天上掉一个大馅饼

使用特权

评论回复
板凳
ayb_ice| | 2007-10-19 07:50 | 只看该作者

可以“菜鸟跪求”。。。

使用特权

评论回复
地板
xwj| | 2007-10-19 07:57 | 只看该作者

LS,不要教坏小孩子哦

使用特权

评论回复
5
starlite_jason| | 2007-10-19 09:21 | 只看该作者

现在的年轻人啊

遇到一点点问题也不自己好好琢磨琢磨,直接上来找程序,这样对你的帮助可不大啊,而且SPI的东西又不是什么复杂玩意,FLASH读写都是大同小异,能静下心把DATASHEET读一遍,啥都明白了

使用特权

评论回复
6
ayb_ice| | 2007-10-19 09:33 | 只看该作者

现在的年轻人啊...

懒。。。

使用特权

评论回复
7
蓝色日出|  楼主 | 2007-10-25 13:46 | 只看该作者

谢谢大家中肯的劝告

非常感谢5楼的xusn!也谢谢大家的中肯的劝告。
怪是我自己没说清楚,我不是想问程序,因为以前没有做过这样的工作,不知道它的工作流程,不知道配程序之前应该做哪些准备工作。觉得自己像是站在一个岔道,不知该走哪条路,因此想得到各位的一点指点,给指条路。
顺便说一句,每个人从菜鸟到高手都是需要一个过程的,各位大侠是否也曾有过不知道该如何下手的经历?是否也曾有过没有任何思路没有头绪的经历?如果我将来有什么心得体会在这里会不毫吝惜的和大家分享。当然,我知道大家是出于好心,想告诉年轻人学习要自己动手自己动脑:)
还是那句话,怪我自己没说清楚问题,这几天作其他的事情,这个工作搁置了几天,接下来还会继续进行,什么时候弄出来了,会传上来和大家分享,请大家指点。

使用特权

评论回复
8
ksslx| | 2007-10-30 13:55 | 只看该作者

楼主好样的!

支持这种精神!

使用特权

评论回复
9
古道热肠| | 2007-10-30 16:26 | 只看该作者

经您一解释,好同志一个,大家不会误会您了。

1。首先要彻底看懂PDF文档
2、上网找参考程序,21IC论坛上就有
3、看懂参考程序,找个写行好一些的,参考自己的硬件作移植。
4、测试参考程序,首先读设备ID
5、读写正常后,优化程序。
6、做模块化结构化处理,并做好文档记录。

使用特权

评论回复
10
ldyeah| | 2007-10-30 16:30 | 只看该作者

同10楼

使用特权

评论回复
11
蓝色日出|  楼主 | 2007-12-25 10:12 | 只看该作者

再次感谢(内蒙归来)

谢谢古道热肠!谢谢大家的理解!
一转眼两个月过去了,这两个月在内蒙出差,去山里用我们的仪器给别人找金矿,昨天刚回来。我们住的地方是一个只有20户人家的小山村,要驱车20里才能洗个澡,还是太阳能的,水量有限,要抓紧时间。哈哈。当地人都是汉民,民风朴实,都很热情很热心。每天早上开车上山,布一公里的测线,测量、收集数据、处理数据。中午就吃在山上,有人给送饭。有几次下雪,就在风雪里面吃午饭,端着菜碗,夹着馒头,飘着雪花……山上还有野兔子,老乡会帮忙抓来,给我们改善伙食。勘探过程中遇到一些问题,有仪器上的,有方法上的,最终都得以解决。在野外虽然艰苦一点,但很充实,也很锻炼人,最大的缺点就是不能上网,程序上的工作也暂时搁置了。现在回来了,终于继续我的工作了!!!

使用特权

评论回复
12
emailli| | 2007-12-25 10:39 | 只看该作者

各位太小看了060了

其实楼主可能想知道可能还不是SPI的通信代码和原理。

最大的可悲是他第一次使用MCU就用了C8051F060。

这款芯片我用过,所以我知道楼主的痛苦。

该款芯片和其他的C8051F不同,芯片初始化及其麻烦,第一次使用该芯片的同学可能都要吃苦了。包括我在内的。

我和深圳新华龙的孙工电话多次沟通,然后要他们发了N个范例程序后才将该芯片的ADC,DMA,定时器,UART……我需要的功能全部驱动起来。

如果各位不相信,可以去看看该芯片的资料,其交叉编译开关,寄存器分页的设置是在是太多,太复杂了。

我相信,如果要楼主 用 标准的 8051,相信不出两天就可以将SPI的驱动写出来。

毕竟时序这个东西不太难。

我写了三年多的8051程序,第一次使用C8051F060的时候用了大概1个月才将所有的硬件模块驱动起来,期间电话无数,邮件N封。并且还有他的仿真头配合使用。还是JTAG仿真的哦。

楼主如果实在是搞不清楚该芯片如何配置,可以来信问问我,我这里有部分源代码。

你这里要用到的如果是模拟SPI的话,只需要配置IO口就可以,那还比较简单,如果使用他的硬件SPI,估计你还要多用一点时间了。


最后再次感叹,该芯片的配置真的不是一般的麻烦。是超级的麻烦。

使用特权

评论回复
13
蓝色日出|  楼主 | 2007-12-25 10:51 | 只看该作者

知音啊!!!

emailli说的非常对!!!交叉编译开关,寄存器分页实在太多太复杂了,要弄清楚这些就要花好多时间!我们现在要用硬件SPI,目前没有任何仿真配合,都是一个点一个点焊出来的。检查通断就要好长时间。
emailli,您的邮箱地址是多少?要和您好好学习学习!!!

使用特权

评论回复
14
winloop| | 2007-12-25 11:02 | 只看该作者

060有SPI接口5楼为什么还要模拟

使用特权

评论回复
15
emailli| | 2007-12-25 11:05 | 只看该作者

给你一个建议

你们到新华龙购买一个C8051F060的开发板。

然后每天骚扰他们的工程师就是了。

我这里也没有写 硬件SPI的 配置代码。

倒是其他部分的配置代码,比如晶振的配置,IO的配置,定时器的配置,ADC的配置,DMA的配置,UART的配置,中断的配置我都有写过了。

还有,他们的编译器 有一个 config2 的小程序,可以帮助你提供配置代码的。仔细研究一下这个小程序有帮助。

我的邮箱是liguangemail#163.com

(注意防垃圾邮件#和@的处理)

使用特权

评论回复
16
蓝色日出|  楼主 | 2007-12-25 11:10 | 只看该作者

不知道说啥好了

感动得不知道说啥好了……
谢谢emailli……

使用特权

评论回复
17
蓝色日出|  楼主 | 2007-12-25 11:23 | 只看该作者

对了,我的邮箱

我的邮箱是:dongyu416#163.com

使用特权

评论回复
18
蓝色日出|  楼主 | 2007-12-25 13:38 | 只看该作者

emailli,给您发了一封邮件,不知道您收到没。

emailli,给您发了一封邮件,不知道您收到没。

使用特权

评论回复
19
蓝色日出|  楼主 | 2007-12-27 15:26 | 只看该作者

C8051F040的SPI调试程序,我做了注释,请大家指正

/////SPI调试程序//////////
/////SPI_master.c//////////////
#include <C8051F040.h>    
typedef unsigned char uchar;
typedef unsigned int uint;
enum {aalen=6};
xdata uchar aa[aalen]={0x81,0x82,0x83,0x84,0x85,0x86};
xdata uchar rr[aalen];
xdata uchar k;
xdata uchar t;
void delay1ms(uint time){//延迟1ms
    uint i;
    uint j;
    for (i=0;i<time;i++){
        for(j=0;j<300;j++);
    }
}
void spi_cfg(uchar spicfg,uchar spickr,uchar spicn){//SPI配置函数
     SFRPAGE = 0x00;    //给SFR页寄存器复零。该字节代表CIP-51MCU读或修改SFR时所用的SFR页
     SPI0CFG = spicfg;    //......?
     SPI0CKR = spickr;    //......?
     SPI0CN = spicn;    //......?   
     EIE1|= 0x01;      //扩展中断允许1:允许SPI0中断
}
void config (void) {
    WDTCN = 0x07;    //看门狗禁止
    WDTCN = 0xDE;   //写入0xDE后四个系统时钟周期内写入0xAD,将禁止WDT
    WDTCN = 0xAD;
    SFRPAGE = 0x0F; //......? 
    XBR0 = 0x02;    //端口I/O交叉寄存器,SPI0连到3个或4个端口引脚,其他I/O不可连
    XBR1 = 0x00;    
    XBR2 = 0x40;    
    XBR3 = 0x00;   
    P0MDOUT = 0x02;
    /*交叉开关配置,SPI总线SCK配置到P0.0口,为开漏输出;MISO为P0.1口,
    推挽输出;MOSI为P0.2口,开漏输出,NSS为P0.3口开漏输出(注:这句是新华龙提供的源代码的注释,但其交叉开关寄存器具体是如何实现这些功能的,我没有看明白???)*/
    SFRPAGE = 0x0F;  //......?
    CLKSEL = 0x00;   //系统时钟选择寄存器:内部晶振起作用
    OSCXCN = 0x00;     //外部振荡器控制寄存器:关闭外部晶振
    OSCICN = 0x84;     //内部振荡器寄存器:使能内部晶振,系统时钟为8分频
    //采用内部晶振,为24.5MHZ8分频(注:24.5/8=3MHZ)
}   //End of config
void main(){
    config();
    spi_cfg(0x50,0x2d,0x08);
    /*
     SPI0CFG = 0x50;    配置寄存器: 主机模式,SCK高电平为空闲,因为SCK采用上拉设计
     SPI0CKR = 0x2D;    时钟速率寄存器: 波特率设置,系统时钟为3MHZ,所以SCK约为32KHZ
     SPI0CN = 0x08;      控制寄存器:0000“10”00,“10”四线方式;“00”三线从方式或三线主方式。NSS线好不连到端口引脚 
     系统为四线制单主机模式,且主机NSS输出为0,注意此时SPIEN为0,SPI尚未开启
    */
    EA=1;
    k=0;
    SFRPAGE=0x00;
    SPIEN=1;//开启SPI
    SPI0DAT=aa[k];//当对SPI0SAT写数据时,SPI总线传输开始
    while(1){
        if(SPIEN==0)
            k=0;//总线释放时,中断程序中将SPIEN清零,在此设断点可全速运行SPI至总线释放
    }
}
void spi_ISR() interrupt 6{//SPI中断
    SFRPAGE=0x00;
    if(k>=aalen)
        SPIEN=0;//数据发送完毕,将SPIEN清零,释放总线
    if(WCOL)//写冲突处理,暂无处理
        WCOL=0;
    if(MODF)//模式错误处理,暂无处理
        MODF=0;
    if(RXOVRN){//接收缓冲区溢出处理
        t=SPI0DAT;//t为接收数据暂存变量
        RXOVRN=0;
    }
    while(!TXBMT);  //如果TXBMT不等于0,说明发送未结束,继续发送
    /*查询上次发送是否结束,因为有很多状态均可使SPI进入中断,
    所以查询上次发送是否结束,以保证写发送缓冲区时不会对数据造成破坏*/
    rr[k]=SPI0DAT;//由于是全双工总线,在发送完一个字节时,主机也收到从机所发的数据
    k++;
    SPI0DAT=aa[k];//发送数据
    SPIF=0;   //SPIF是SPI0的终端标志。该位不能被硬件自动清0,必须软件清0
}

有?的地方都是没读明白的地方

使用特权

评论回复
20
ga333mao| | 2007-12-27 15:36 | 只看该作者

11

用过081和161,现在存取着老多东西里面。感觉这个东西还挺好,有时候直接把常量啥得给扔在里面,还省了FLASH空间,不错,不错。

使用特权

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

本版积分规则

28

主题

235

帖子

0

粉丝