如何让arm32与adxl345利用spi进行通信?
最近在做自动控制的四轴,但是始终不能让stm32与adxl345通过四线spi进行通讯:写入0x00,返回0xE5,cs拉高后延时100ms再拉低,写入0x2C返回的还是0xE5(应该返回00001010),纠结中……不知是否有人同纠结?如果有在st官方固件库下与adxl345通信的例程,希望能够提供给我,小菜鸟感激不尽~E-mail:wanghuifen987@163.com 你好!不知道怎么了,网上好像没有完整的程序,在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=data;
}
SET_CS();
} 有的人说通信速度太快了,如何放慢! 我也出现了这个问题,不管读什么都是0xE5,请问你解决了没,可否跟我联系fengc234@163.com 我的也是啊啊!!fifo模式会返回E5
页:
[1]