[51单片机] HMC5883L IIC通信,收不到答复

[复制链接]
1004|0
 楼主| 1324968 发表于 2017-11-21 17:29 | 显示全部楼层 |阅读模式
本帖最后由 1324968 于 2017-11-21 17:38 编辑

以下是代码,IIC通信
HMC5883L的控制指令是 0X3C  但是发出去,一直收不到回复。
然后我换了24C02测试IIC 控制命令换0xa0 能收到回复,说明IIC是OK的
但是不知道为什么HMC5883L就是不行。

和HMC5883L通信 收不到回复动作


和24C02通信能收到回复动作
  1. #define        SCL                                        P1_0
  2. #define        SDA                                  P1_1                //
  3. #define        SDA_OUT_PIN()          P1MODL = _1010_1010b;//P1.3=MOTYO_OUT_Z,P1.2=MOTYO_OUT_F,P1.1=BLUE_S2,P1.0=BLUE_S1
  4. #define        SDA_IN_PIN()          P1MODL = _1010_0010b;//P1.3=MOTYO_OUT_Z,P1.2=MOTYO_OUT_F,P1.1=BLUE_S2,P1.0=BLUE_S1

  5. #define SCL_H         SCL=1
  6. #define SCL_L         SCL=0   
  7. #define SDA_H         SDA=1
  8. #define SDA_L         SDA=0
  9. #define SDA_read      P1_1

  10. #define        HMC5883L_Addr   0x3C
  11. uchar BUF[8];                         //接收数据缓存区  
  12. /**
  13.   * [url=home.php?mod=space&uid=247401]@brief[/url] I2C delay
  14.   * @param  None
  15.   * @retval None
  16.   */
  17. void I2C_delay(void)
  18. {
  19.   uchar i=8;
  20.   while(i)
  21.   {
  22.     i--;
  23.   }
  24. }
  25. /**
  26.   * [url=home.php?mod=space&uid=247401]@brief[/url] delay 5ms
  27.   * @param  None
  28.   * @retval None
  29.   */
  30. void delay5ms(void)
  31. {
  32.   int i=5000;
  33.   while(i)
  34.   {
  35.     i--;
  36.   }  
  37. }
  38. /**
  39.   * [url=home.php?mod=space&uid=247401]@brief[/url] delay n ms
  40.   * @param  None
  41.   * @retval None
  42.   */
  43. void Delayms(unsigned int m)
  44. {
  45.   unsigned int i;
  46.   
  47.   for(; m != 0; m--)        
  48.        for (i=0; i<100; i++);//50000
  49. }
  50. /**
  51.   * [url=home.php?mod=space&uid=247401]@brief[/url] I2C start
  52.   * @param  None
  53.   * @retval None
  54.   */
  55. void IIC_Start(void)     // 起始位   
  56. {
  57.                 SDA=1;
  58.                 SCL=1;
  59.                 I2C_delay();                 // 保持4.7uS以上(TSU.STA)  
  60.                 SDA=0;
  61.                 I2C_delay();                 // 保持4uS以上(THD.STA)
  62.                 SCL = 0;                 // 方便下一次时钟从低到高变化的操作。
  63. }
  64. void IIC_Stop(void)      // 停止位
  65. {
  66.                 SDA=0;
  67.                 SCL=1;                 
  68.                 I2C_delay();                 // 保持4.0uS以上(TSU.STO)
  69.                 SDA=1;                  
  70.                 I2C_delay();                 //        保持4.7uS以上(TBUF)
  71. }
  72. void IIC_Ack(void)       // 主机应答位
  73. {
  74.                 SDA=0;        
  75.                 I2C_delay();                 // 保持0.2uS以上(TSU.DAT)
  76.                 SCL=1;        
  77.                 I2C_delay();                 // 保持4.0uS以上(THIGH)
  78.                 SCL=0;
  79.                 I2C_delay();                 // 保持4.7uS以上(TLOW),此语句可以不要                        
  80. }
  81. void  IIC_NoAck(void)    // 主机反向应答位
  82. {
  83.         SDA=1;        
  84.                 I2C_delay();                 // 保持0.2uS以上(TSU.DAT)  
  85.         SCL=1;        
  86.                 I2C_delay();             // 保持4.0uS以上(THIGH)           
  87.         SCL=0;
  88.                 I2C_delay();                                 
  89. }
  90. bit IIC_GetACK()       // 获取从机应答信号,返回为0时收到ACK,返回为1时没收到ACK
  91. {
  92.                 bit ErrorBit;
  93.         
  94.                 SDA = 1;
  95.             I2C_delay();                // 保持0.2uS以上(TSU.DAT)
  96.         SDA_IN_PIN();
  97.                 SCL = 1;
  98.          
  99.                 I2C_delay();                // 保持4.0uS以上(THIGH)
  100.                 ErrorBit=SDA;
  101.                 SCL = 0;         
  102.                 I2C_delay();                // 保持4.7uS以上(TLOW),此语句可以不要
  103.         SDA_OUT_PIN();
  104.                 return ErrorBit;
  105. }
  106. //*********************************************************************
  107. // 功能描述:主设备向从设备发送个一字节
  108. // 返回值: 0->成功  1->失败
  109. //*********************************************************************/
  110. unsigned char IIC_SendByte(unsigned char Data)   
  111. {
  112.         unsigned char i;               // 位数控制
  113.         for (i=0;i<8;i++)           // 写入时是用时钟上升沿同步数据
  114.         {
  115.                 if (Data & 0x80)
  116.                         SDA = 1;
  117.         else
  118.                         SDA = 0;
  119.        I2C_delay();                   // 保持0.2uS以上(TSU.DAT)
  120.         SCL = 1;
  121.                 I2C_delay();                  // 保持4.0uS以上(THIGH)
  122.                 SCL = 0;
  123.                 I2C_delay();                  // 保持4.7uS以上(TLOW)
  124.         Data <<= 1;
  125.          }        
  126.         return 1;
  127. //         return IIC_GetACK();  
  128. }

  129. //*********************************************************************
  130. // 功能描述:主设备向从设备读取一个字节
  131. // 返回值:  读到的字节  
  132. // *********************************************************************/
  133. unsigned char IIC_RecByte(void)       // 接收单字节的数据,并返回该字节值
  134. {
  135.         unsigned char i,rbyte=0;
  136.         SDA_IN_PIN();
  137.         SDA=1;
  138.         for(i=0;i<8;i++)                  // 读出时是用时钟下降沿同步数据
  139.         {
  140.                 SCL=0;
  141.                 I2C_delay();                          // 保持4.7uS以上(TLOW)
  142.                 SCL=1;
  143.                 I2C_delay();                          // 保持4.0uS以上(THIGH)
  144.                 if(SDA) rbyte|=(0x80>>i);
  145.         }
  146.         SCL=0;
  147.         SDA_OUT_PIN();
  148.         return rbyte;
  149. }
  150. /**
  151.   * [url=home.php?mod=space&uid=247401]@brief[/url] I2C single write
  152.   * @param  None
  153.   * @retval None
  154.   */
  155. bool Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data)
  156. {
  157.   IIC_Start();
  158.   IIC_SendByte(SlaveAddress);
  159.   if(IIC_GetACK())
  160.         {
  161.                 IIC_Stop();
  162.                 return FALSE;
  163.         }
  164.   IIC_SendByte(REG_Address );
  165.   IIC_GetACK();
  166.   IIC_SendByte(REG_data);
  167.   IIC_GetACK();
  168.   IIC_Stop();
  169.   Delayms(5);
  170.   return TRUE;
  171. }
  172. /**
  173.   * @brief I2C single read
  174.   * @param  None
  175.   * @retval None
  176.   */
  177. unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)
  178. {
  179.   unsigned char REG_data;
  180.   IIC_Start();
  181.   IIC_SendByte(SlaveAddress);
  182.   if(!IIC_GetACK()){IIC_Stop();return FALSE;}
  183.   IIC_SendByte((uchar) REG_Address);
  184.   IIC_GetACK();
  185.   IIC_Start();
  186.   IIC_SendByte(SlaveAddress+1);
  187.   IIC_GetACK();
  188.   REG_data= IIC_RecByte();
  189.   IIC_NoAck();
  190.   IIC_Stop();
  191.   return REG_data;
  192. }
  193. /**
  194.   * @brief hmc5883 func
  195.   * @param  None
  196.   * @retval None
  197.   */
  198. void read_hmc5883l(void)
  199. {
  200.   Single_Write(0x3C,0x00,0x14);
  201. //  Single_Write(HMC5883L_Addr,0x01,0x20);
  202. //  Single_Write(HMC5883L_Addr,0x02,0x00);
  203. //  Delayms(5);
  204. //  BUF[0]=Single_Read(HMC5883L_Addr,0x03); //X
  205. //  BUF[1]=Single_Read(HMC5883L_Addr,0x04);
  206. //  BUF[2]=Single_Read(HMC5883L_Addr,0x05); //Y
  207. //  BUF[3]=Single_Read(HMC5883L_Addr,0x06);  
  208. //  BUF[4]=Single_Read(HMC5883L_Addr,0x07); //Z
  209. //  BUF[5]=Single_Read(HMC5883L_Addr,0x08);
  210. }




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

218

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部