这是数据手册和应用笔记
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);
}
|