OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3149|回复: 2

STM8S005读取5883的时候,用ST-LINK在线仿真可以读取数据,但是下载到片上运行时就无法运行

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2015-12-9
在线时间
0 小时
发表于 2015-12-9 15:56:17 | 显示全部楼层 |阅读模式
5金钱
STM8S005读取HMC5883的时候,用ST-LINK在线仿真可以读取数据,但是下载到片上运行时就无法运行。用逻辑分析仪观察波形是一模一样的。可能时间间隙上有区别。是器件本身的问题呢还是什么的。。。搞了两三天,有点晕。
附上IIC底层代码

/*******************************************************************************
* Function Name : I2C_GPIO_Config
* Description   : Configration Simulation IIC GPIO
* Input         : None 
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_INIT(void)
{
/* I2C_Init(100000, 0xAAA, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);
I2C_Cmd(ENABLE); */

GPIO_Init(GPIO_IIC1,PIN_IIC1_SDA,GPIO_MODE_OUT_OD_HIZ_SLOW);
GPIO_Init(GPIO_IIC1,PIN_IIC1_SCL,GPIO_MODE_OUT_OD_HIZ_SLOW);
SDA_H;
SCL_H;
}
/*******************************************************************************
* Function Name : I2C_delay
* Description   : Simulation IIC Timing series delay
* Input         : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_delay(void)
{
nop();
nop();
nop();
nop();
nop();
}

void delay5ms(void)
{
   unsigned int i;
   i=5000;
   while(i--) ;
}
/*******************************************************************************
* Function Name : I2C_Start
* Description   : Master Start Simulation IIC Communication
* Input         : None
* Output         : None
* Return         : Wheather Start
****************************************************************************** */
uint16_t I2C_Start(void)
{
SDA_H;
SCL_H;
I2C_delay();
if(!SDA_read)return FALSE; //SDA线为低电平则总线忙,退出
SDA_L;
I2C_delay();
if(SDA_read) return FALSE; //SDA线为高电平则总线出错,退出
SDA_L;
I2C_delay();
return TRUE;
}
/*******************************************************************************
* Function Name : I2C_Stop
* Description   : Master Stop Simulation IIC Communication
* Input         : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_Stop(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SDA_H;
I2C_delay();

/*******************************************************************************
* Function Name : I2C_Ack
* Description   : Master Send Acknowledge Single
* Input         : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_Ack(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}   
/*******************************************************************************
* Function Name : I2C_NoAck
* Description   : Master Send No Acknowledge Single
* Input         : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_NoAck(void)
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();

/*******************************************************************************
* Function Name : I2C_WaitAck
* Description   : Master Reserive Slave Acknowledge Single
* Input         : None
* Output         : None
* Return         : Wheather Reserive Slave Acknowledge Single
****************************************************************************** */
uint16_t I2C_WaitAck(void) //返回为:=1有ACK,=0无ACK
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
      SCL_L;
 I2C_delay();
      return FALSE;
}
SCL_L;
I2C_delay();
return TRUE;
}
/*******************************************************************************
* Function Name : I2C_SendByte
* Description   : Master Send a Byte to Slave
* Input         : Will Send Date
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_SendByte(unsigned char SendByte) //数据从高位到低位//
{
    u8 i=8;
    while(i--)
    {
        SCL_L;
        I2C_delay();
      if(SendByte&0x80)
        SDA_H;  
      else 
        SDA_L;  
 
        SendByte<<=1;
        I2C_delay();
SCL_H;
        I2C_delay();
    }
    SCL_L;
}  
/*******************************************************************************
* Function Name : I2C_RadeByte
* Description   : Master Reserive a Byte From Slave
* Input         : None
* Output         : None
* Return         : Date From Slave 
****************************************************************************** */
unsigned char I2C_RadeByte(void)  //数据从高位到低位//

    u8 i=8;
    u8 ReceiveByte=0;

    SDA_H;
    while(i--)
    {
      ReceiveByte<<=1;      
      SCL_L;
      I2C_delay();
 SCL_H;
      I2C_delay();
      if(SDA_read)
      {
        ReceiveByte|=0x01;
      }
    }
    SCL_L;
    return ReceiveByte;

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2015-12-9
在线时间
0 小时
 楼主| 发表于 2015-12-9 20:23:58 | 显示全部楼层
坐等神人回复。。。。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2015-12-9
在线时间
0 小时
 楼主| 发表于 2015-12-10 11:58:02 | 显示全部楼层
找到问题,初始化5883的时候,本来只对0x02的寄存器初始化,没有对0x00跟0x01初始化,加上初始化后即可。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 19:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表