你的程序,部分子程与网上例程时序稍有不同,多了起始的时钟拉低【 WriteSCL0();】,把它拿掉试试看。
如下是我的:
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void ADXL345_SendACK(ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
__delay_us(5); //延时
SCL = 0; //拉低时钟线
__delay_us(5); //延时
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void ADXL345_SendByte(unsigned char dat)
{
unsigned char i;
for (i=0; i<8; i++) //8位计数器
{
if(dat&0x80)
SDA=1;
else
SDA=0;
SCL = 1; //拉高时钟线
__delay_us(5); //延时
SCL = 0; //拉低时钟线
__delay_us(5); //延时
dat <<= 1; //移出数据的最高位
}
ADXL345_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
unsigned char ADXL345_RecvByte()
{
unsigned char i;
unsigned char dat = 0;
TRISD0 = 1; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL = 1; //拉高时钟线
__delay_us(5); //延时
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
__delay_us(5); //延时
}
TRISD0 = 0;
return dat;
} |