|
发表于 2011-8-17 16:28:25
|
显示全部楼层
你好!不知道怎么了,网上好像没有完整的程序,在EDN论坛上看到一个用IO模拟SPI的程序,结果弄了两天,得出一个结果,和你的一样,0XE5是读出来了,可无论读哪个寄存器都是0xE5!,天哪!帮帮我吧!这是我的程序
/***************SPI write*************** *******/
void write_single_byte(uchar addr,uchar data)
{
uchar com_addr=0;
com_addr=addr;
SET_OUT_MOSI;
SET_IN_MISO;
SET_CS();
SET_CLK();
CLR_CS();
for(uchar i=0;i<8;i++)
{
CLR_CLK();
if(0x80==com_addr&0x80)
{
MOSI=1;
}
else
{
MOSI=0;
}
SET_CLK();
com_addr=com_addr<<1;
}
// SET_CLK();
for(uchar i=0;i<8;i++)
{
CLR_CLK();
if(0x80==data&0x80)
{
MOSI=1;
}
else
{
MOSI=0;
}
SET_CLK();
data<<=1;
}
SET_CS();
}
/***********************************/
void read_multiply_byte(uchar addr,char *buf,uchar rege_count)
{
uchar byte_count=0;
uchar com_addr=0;
char data=0;
uchar value=0;
SET_OUT_MOSI; //MOSI设置为输出
SET_IN_MISO; //MISO设置为输入
if(rege_count==1) //判断是不是连续读取
{
com_addr=addr|0x80; //设置读标志
}
else
{
com_addr=addr|0xC0; //设置连续读标志
}
// SET_CS();
// SET_CLK();
CLR_CS(); //SPI起始头
CLR_CLK();
for(uchar i=0;i<8;i++) //写入8位
{
//不知道为什么要先左移
if(0x80==com_addr&0x80)
{
MOSI=1;
}
else
{
MOSI=0;
}
SET_CLK();
value<<=1;
if(MISO)
{
value|=0x01;
}
CLR_CLK();
com_addr<<=1;
}
for(byte_count=0;byte_count<rege_count;byte_count++)
{
for(uchar i=0;i<8;i++)
{
data<<=1;
if(MISO)
{
data|=0x01;
}
SET_CLK();
CLR_CLK();
}
buf[byte_count]=data;
}
SET_CS();
} |
|