打印

哪位高手能我看看这个程序有什么问题

[复制链接]
1145|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jyynl|  楼主 | 2014-4-8 14:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, TE, dc, ui, AC
这是数据手册和应用笔记
MI200E-AP-Note-V1.5.pdf (943.53 KB) MI200E-datasheet-v3.1_ch(1).pdf (660.75 KB)
用的是51单片机模拟SPI和芯片通信,下面是程序
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit MOSI=P1^0;         //主设备发送从设备接收线,master output subordinate input
sbit MISO=P1^1;         //从设备发送主设备接收线  master input subordinate output
sbit sck=P1^2;              //SPI时钟
sbit cs=P1^3;           //片选
sbit MI200E_RST=P1^4;   //复位
sbit MI200E_EMI=P1^7;   //发送时为高,接收时为低
sbit frm=P3^2;          //接收时的中断,这里先不用
void cudelay(uint xms);    //简单延时
void init_MI200E();
void send();
void Write_CommandReg(uchar add,uchar com);    //写入控制寄存器
uchar Read_CommandReg(uchar add);              //读取控制寄存器
void Write_DataReg(uchar add,uint dat);        //写入数据寄存器
uint Read_DataReg(uchar add);                  //读取数据寄存器
void cudelay_50us();             //简单延时

void main()
{

        init_MI200E();       
        while(1)
        {
                send();                 //先一直发数据试验能否用
        }

}



void cudelay_ms(uint xms)      
{
        int i,j;
        for(i=0;i<xms;i++)
                for(j=130;j>0;j--);
}

void cudelay_50us()
{
        uchar i;
        for(i=0;i<9;i++);
}

void init_MI200E()                                   //初始化
{
        MI200E_RST=0;
        cudelay_ms(600);                        //要求延时超过500ms
        MI200E_RST=1;
        cudelay_ms(60);                         //要求延时超过50ms
        Write_CommandReg(0x01,0xFF);
        Write_CommandReg(0x0C,0x58);


//        Write_CommandReg(0x0D,0x01);         //应用笔记这样写
        Write_CommandReg(0x0D,0x0A);         //数据手册这样写



        Write_CommandReg(0x10,0x66);
        Write_CommandReg(0x12,0x66);
        Write_CommandReg(0x14,0x66);
        Write_CommandReg(0x11,0x88);
        Write_CommandReg(0x13,0x88);
        Write_CommandReg(0x15,0x88);
        Write_CommandReg(0x07,0xFF);
        Write_CommandReg(0x0A,0x00);
        Write_CommandReg(0x0B,0x00);
}

//发送程序
void send()
{
        uchar TI;
        uchar RDMR_command;          //用来读模式寄存器0x81的值
        uchar i;
        uint CRC;
        MI200E_EMI=1;       
        Write_CommandReg(0x01,0x01); //bit6~4扩频码字,bit3~2波特率选择,bit1~0载波频率


       
    TI=Read_CommandReg(0x82);
        TI=TI|0x80;                              //先将TI置1,按数据手册所说上电时TI位的初始值为0,而下一步要TI值为1才进行的下去,TI是当数据缓冲区的数据成功发送后由硬件置位的,保险起见
        Write_CommandReg(0x02,TI); //往里写1以使下一步能进行

        do
        {
                TI=Read_CommandReg(0x82);         //读reg(0x82)的最高位TI,TI=0则继续读,直到TI=1进入下一步
        }
        while(TI&0x80==0);
       

        TI=TI&0x7F;                       //在往发送缓冲区送入新字节之前将TI位复位,不清楚是在往数据寄存器写入数据之前还是之后将TI清零,前后都试过,都没成功,不知道是不是因为有别的错
        Write_CommandReg(0x02,TI);   


        RDMR_command=Read_CommandReg(0x81);
        Write_CommandReg(0x01,RDMR_command|0x0C);  //前4BYTE固定用200波特率发送,当初始设置的波特率不是200时使用

        Write_DataReg(0x04,0xFFFF);              //第一和第二BYTE固定发送0xFF





        do
        {
                TI=Read_CommandReg(0x82);
        }
        while(TI&0x80==0);


        TI=TI&0x7F;                     //在往发送缓冲区送入新字节之前将TI位复位,不清楚是TI一被置位后就清零还是先写入数据寄存器以后再清零,两种都试过不管用,不知道是不是还有其他的错
        Write_CommandReg(0x02,TI);   

       

        Write_CommandReg(0x02,TI&0x7D);      //清零reg(0x02)的CRC校验位并清零TI位
        Write_DataReg(0x04,0x1A0B);          //第三BYTE是固定0x1A,第四BYTE装波特率和字长,长度11个WORD,即22个BYTE





        do
        {
                TI=Read_CommandReg(0x82);
        }
        while(TI&0x80==0);


        TI=TI&0x7F;                              //在往发送缓冲区送入新字节之前将TI位复位,不清楚是在往数据寄存器写入数据之前还是之后将TI清零,前后都试过,都没成功,不知道是不是因为有别的错
        Write_CommandReg(0x02,TI);   



        Write_CommandReg(0x01,RDMR_command);         //当初始设置的波特率不是200时使用

        Write_DataReg(0x04,0xFFFF);   //第5和第6个BYTE,先全发1试验







        for(i=0;i<9;i++)         //11个WORD包括最后的2BYTE即1WORD长的CRC,再加上之前发的第5和第6个BYTE也是一个WORD,剩下N-2个
        {       
                do
                {
                        TI=Read_CommandReg(0x82);
                }
                while(TI&0x80==0);       


                TI=TI&0x7F;                   //在往发送缓冲区送入新字节之前将TI位复位,不清楚是在往数据寄存器写入数据之前还是之后将TI清零,前后都试过,都没成功,不知道是不是因为有别的错
                Write_CommandReg(0x02,TI);   
       
               
       
                Write_DataReg(0x04,0xFFFF);   


        }
        cudelay_50us();                                           //延时超过50us
       
        CRC=(uint)(Read_CommandReg(0xA8));                   //从0xA8和0xA9中取出CRC
        CRC=(CRC<<8)|(uint)(Read_CommandReg(0xA9));
       
        do
        {
                TI=Read_CommandReg(0x82);
        }
        while(TI&0x80==0);

       
        TI=TI&0x7F;                              //在往发送缓冲区送入新字节之前将TI位复位
        Write_CommandReg(0x02,TI);




        Write_DataReg(0x04,CRC);              //发送CRC



        do
        {
                TI=Read_CommandReg(0x82);
        }
        while(TI&0x80==0);

        TI=TI&0x7F;                              //在往发送缓冲区送入新字节之前将TI位复位,不清楚是在往数据寄存器写入数据之前还是之后将TI清零,前后都试过,都没成功,不知道是不是因为有别的错                  
        Write_CommandReg(0x02,TI);



        Write_CommandReg(0x01,0x8D);        //把reg(0x01)的bit[7]位置1,将芯片配置为默认接收状态
}



//写入控制寄存器
void Write_CommandReg(uchar add,uchar com)
{
       
        uchar i;
        uchar mark;
        cs=0;
        mark=0x80;
        _nop_();
        for(i=0;i<8;i++)
        {
                sck=0;
                if(add&mark)
                {
                        MOSI=1;
                }
                else
                {
                        MOSI=0;
                }
                sck=1;
                mark>>=1;
        }
        mark=0x80;
        for(i=0;i<8;i++)
        {
                sck=0;
                if(com&mark)
                {
                        MOSI=1;
                }
                else
                {
                        MOSI=0;
                }

                sck=1;
                mark>>=1;
        }
        _nop_();
        cs=1;
}

//读取控制寄存器
uchar Read_CommandReg(uchar add)
{
       
        uchar i;
        uchar mark;
        uchar readdata;
        cs=0;
        mark=0x80;
        readdata=0;
        _nop_();
        for(i=0;i<8;i++)
        {
                sck=0;
                if(add&mark)
                {
                        MOSI=1;
                }
                else
                {
                        MOSI=0;
                }
                sck=1;
                mark>>=1;
        }
        _nop_();
        for(i=0;i<8;i++)
        {
                readdata<<=1;       
                sck=0;
                sck=1;
                if(MISO)
                {
                        readdata|=0x01;
                }               
        }
        _nop_();
        cs=1;
        return(readdata);
       
}



//写入数据寄存器
void Write_DataReg(uchar add,uint dat)
{
       
        uchar i;
        uchar mark;
        uint marklong;
        cs=0;
        mark=0x80;
        marklong=0x8000;
        _nop_();
        for(i=0;i<8;i++)
        {
                sck=0;
                if(add&mark)
                {
                        MOSI=1;
                }
                else
                {
                        MOSI=0;
                }
                sck=1;
                mark>>=1;
        }

        for(i=0;i<16;i++)
        {
                sck=0;
                if(dat&marklong)
                {
                        MOSI=1;
                }
                else
                {
                        MOSI=0;
                }

                sck=1;
                marklong>>=1;
        }
        _nop_();
        cs=1;
}

//读取数据寄存器
uint Read_DataReg(uchar add)
{

        uchar i;
        uchar mark;
        uint readdata;
        cs=0;
        mark=0x80;
        readdata=0;
        _nop_();
        for(i=0;i<8;i++)
        {
                sck=0;
                if(add&mark)
                {
                        MOSI=1;
                }
                else
                {
                        MOSI=0;
                }
                sck=1;
                mark>>=1;
        }
        _nop_();
        for(i=0;i<16;i++)
        {
                readdata<<=1;       
                sck=0;
                sck=1;
                if(MISO)
                {
                        readdata|=0x0001;
                }               
        }
        _nop_();
        cs=1;
        return(readdata);
       
}


相关帖子

沙发
chuying1990| | 2014-4-9 15:51 | 只看该作者
请问,您的程序问题解决了吗?我现在也在学习MI200E,很多不懂得地方啊。

使用特权

评论回复
板凳
chuying1990| | 2014-4-9 16:21 | 只看该作者
请问您的程序问题解决了吗?我现在也在学习MI200E有好多不懂得地方啊,想向您求教。

使用特权

评论回复
地板
jyynl|  楼主 | 2014-4-10 00:11 | 只看该作者
chuying1990 发表于 2014-4-9 16:21
请问您的程序问题解决了吗?我现在也在学习MI200E有好多不懂得地方啊,想向您求教。 ...

没有呢……没想到还能碰到同志。我也是刚刚开始看这个,以前也没怎么做过东西……只能说多多交流一下吧

使用特权

评论回复
5
chuying1990| | 2014-4-13 07:39 | 只看该作者
jyynl 发表于 2014-4-10 00:11
没有呢……没想到还能碰到同志。我也是刚刚开始看这个,以前也没怎么做过东西……只能说多多交流一下吧 ...

我看了您的提问,我也有同样的疑惑,就是延时的问题,不知道你是怎么解决的?还有您是怎么验证全发1能成功呢,是用两片MI200E,一个发送,一个接收是么?求助!

使用特权

评论回复
6
chuying1990| | 2014-4-14 12:07 | 只看该作者
没有回复呢.....十分需要帮助....

使用特权

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

本版积分规则

26

主题

102

帖子

0

粉丝