传感技术
直播中

远风

9年用户 1019经验值
擅长:MEMS/传感技术 模拟技术 存储技术
私信 关注
[问答]

ADXL345串口发送“COMM_SendOneByte(0xA5);”发送到电脑上,串口助手的数据就不正常怎么解决?

各位好!我用ADXL345出现问题,一筹莫展,查不出问题所在。
mcu用stc15w102,IIC读写。
主函数中如果没有“devid = ADXL_ReadOneByte(0x00);”语句,串口发送“COMM_SendOneByte(0xA5);”发送到电脑上串口助手的数据正常;如果加上“devid = ADXL_ReadOneByte(0x00);”语句,串口发送“COMM_SendOneByte(0xA5);”发送到电脑上串口助手的数据就不正常。说明是ADXL_ReadOneByte(xxx);程序有问题。但反反复复检查就是查不出来问题所在。请大家帮助,不胜感谢!下面是相关程序:
// Use mcu STC15W102
void Dly5us(void)  //@11.0592MHz
{
  uchr i;
nop_();
//i = 11;
  i = 8;
while (--i);
}
void ADXL_StrtTrans(void)
{
  SDA_TXD = 1;
  SCL = 1;   
  Dly5us();  
  SDA_TXD = 0;
  Dly5us();  
  SCL = 0;
//Dly5us();       // tem
}
void ADXL_StopTrans(void)
{
  SDA_TXD = 0;
  SCL = 1;   
  Dly5us();  
  SDA_TXD = 1;
  Dly5us();  
//SCL = 0;      // tem
}
void ADXL_WritAck(bit ack)
{                           
  SDA_TXD = ack;
  SCL = 1;      
  Dly5us();   
  SCL = 0;      
  Dly5us();
//SDA_TXD = !SDA_TXD;   // tem
}
bit ADXL_ReadAck(void)
{
//SDA_TXD = 1;   // tem
  SCL = 1;     
  Dly5us();   
  CY = SDA_TXD;
  SCL = 0;     
  Dly5us();   
  return CY;
}
void ADXL_WritEightBit(uchr dat)
{
  uchr i;
  for (i=0; i<8; i++)   
  {                     
    dat <<= 1;         
    SDA_TXD = CY;
  //Dly5us();       // tem
    SCL = 1;            
    Dly5us();         
    SCL = 0;            
    Dly5us();       //
  }
  ADXL_ReadAck();   //
}
uchr ADXL_ReadEightBit(void)
{
  uchr i;
  uchr dat = 0;
  SDA_TXD = 1;         
  for (i=0; i<8; i++)   
  {
    dat <<= 1;        //
    SCL = 1;            
    Dly5us();         
    dat |= SDA_TXD;
  //dat <<= 1;        // tem
    SCL = 0;            
    Dly5us();         
  }
  return dat;
}
void ADXL_WriteOneByte(uchr AdxlRegAddr,uchr EightBitData)
{
  ADXL_StrtTrans();                  // ADXL345 start transmission
  ADXL_WritEightBit(ADXL_SLV_ADDR);  // write the IIC slave address of device into ADXL345
//ADXL_ReadAck();                    // tem
  ADXL_WritEightBit(AdxlRegAddr);    // write the register address into ADXL345
//ADXL_ReadAck();                    // tem
  ADXL_WritEightBit(EightBitData);   // write the data into register of ADXL345
//ADXL_ReadAck();                    // tem
  ADXL_StopTrans();                  // ADXL345 stop transmission
}
uchr ADXL_ReadOneByte(uchr AdxlRegAddr)
{  
  uchr AdxlReadDatBuf;
  ADXL_StrtTrans();                     // ADXL345 start transmission
  ADXL_WritEightBit(ADXL_SLV_ADDR);     // write the IIC slave address of device into ADXL345
//ADXL_ReadAck();                       // tem
  ADXL_WritEightBit(AdxlRegAddr);       // write the register address into ADXL345
//ADXL_ReadAck();                       // tem
  ADXL_StrtTrans();                     // ADXL345 start transmission
  ADXL_WritEightBit(ADXL_SLV_ADDR+1);   // write the IIC slave address of device into ADXL345
//ADXL_ReadAck();                       // tem
  AdxlReadDatBuf = ADXL_ReadEightBit(); // register data in ADXL345 is readed out
  ADXL_WritAck(1);                      // Send ACK to ADXL345
  ADXL_StopTrans();                     // ADXL345 stop transmission
  return AdxlReadDatBuf;
}
void ADXL_Init(void)
{
  ADXL_WriteOneByte(ADXL_DATA_FORMAT, 0x0B);   //Set DATA_FORMAT:mesurement scope,+ or - 16 gram,13 bit mode.
  ADXL_WriteOneByte(ADXL_BW_RATE,     0x08);   //Set BW_RATE:Rate = 25Hz.
  ADXL_WriteOneByte(ADXL_POWER_CTL,   0x08);   //Set POWER_CTL:mesurement mode is started.
  ADXL_WriteOneByte(ADXL_INT_ENABLE,  0x80);   //Set INT_ENABLE:DATA_READY interrupt is inhibit.
  ADXL_WriteOneByte(ADXL_OFFSETX,     0x00);   //Set ADXL_OFFSETX.
  ADXL_WriteOneByte(ADXL_OFFSETY,     0x00);   //Set ADXL_OFFSETY.
  ADXL_WriteOneByte(ADXL_OFFSETZ,     0x05);   //Set ADXL_OFFSETZ.
}
void main(void)
{
  ADXL_Init();
  while(1)                                   
  {                                          
    devid = ADXL_ReadOneByte(0x00);         
    COMM_SendOneByte(0xA5);                  
  }                                                      
}

更多回帖

发帖
×
20
完善资料,
赚取积分