打印

关于硬件I2C的问题

[复制链接]
5793|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dong130300|  楼主 | 2012-4-29 11:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用硬件I2C的时候,程序死在这里,怎么办啊
I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);
  
  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
沙发
PowerSource| | 2012-4-29 14:22 | 只看该作者
你的I2C地址对吗?

使用特权

评论回复
板凳
dong130300|  楼主 | 2012-4-29 15:05 | 只看该作者
对啊,这回配置对了,0xa0,是没有问题的

使用特权

评论回复
地板
PowerSource| | 2012-4-29 15:51 | 只看该作者
陷入死循环说明SR2寄存器的TRA(数据已发送)、BUSY(总线正在通信)、MSL(主模式)或SR1寄存器的TXE(DR为空)、ADDR(地址已发送)中的某些位没有置位,你检查一下I2C初始化配置是否正确。我看你的上个帖子,I2C初始化的时候没有I2C_AcknowledgeConfig(I2C1,ENABLE);//允许一字节一应答模式。

使用特权

评论回复
5
t13253195298| | 2012-4-29 17:56 | 只看该作者
应该是I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED函数问题

使用特权

评论回复
6
dong130300|  楼主 | 2012-4-29 18:01 | 只看该作者
我试过了,还是不好使啊,刚才用软件模拟了,结果还是出不来
void IIC_Delay(u16 times)
                {
                u16 loop,loop1;
                for(loop=0;loop<times;loop++)
                for(loop1=times;loop1>0;loop1--);
                }
void  IIC_SetSclPin(void)
                {
                GPIO_WriteBit(GPIOB,GPIO_Pin_6,Bit_SET);
                }
void    IIC_ClrSclPin(void)
                {
                GPIO_WriteBit(GPIOB,GPIO_Pin_6,Bit_RESET);
                }
void    IIC_SetSdaPin(void)
                {
                GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_SET);
                }
void    IIC_ClrSdaPin(void)
                {
                GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_RESET);
                }
bool    IIC_GetSdaStus(void)
                {
                bool tmp;
               
                if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)&0x01) tmp=TRUE;
                else tmp=FALSE;
                return tmp;
               
                }
bool   IIC_CheckACK(void)
                {
                return IIC_GetSdaStus();
                }
void    IIC_SetScl(bool HLow)
                {
                HLow?IIC_SetSclPin():IIC_ClrSclPin();
                }
void    IIC_SetSda(bool HLow)
                {
                HLow?IIC_SetSdaPin():IIC_ClrSdaPin();
                }
void   IIC_Start(void)
                {

                //    SCL(Low);
                IIC_SetScl(LOW);
                //  Delay(DelayTime);
                IIC_Delay(IIC_DELAYTIME);
                //  SDA(Hight);
                IIC_SetSda(HIGHT);

                //  Delay(DelayTime);
                IIC_Delay(IIC_DELAYTIME);
                // SCL(Hight);
                IIC_SetScl(HIGHT);
                //  Delay(DelayTime);
                IIC_Delay(IIC_DELAYTIME);
                //   SDA(Low);
                IIC_SetSda(LOW);
                //  Delay(DelayTime);
                IIC_Delay(IIC_DELAYTIME);
                //  SCL(Low);
                IIC_SetScl(LOW);

                }
void   IIC_Stop(void)
                {

                IIC_SetSda(LOW);

                IIC_Delay(IIC_DELAYTIME);
                IIC_SetScl(HIGHT);
                IIC_Delay(IIC_DELAYTIME);
                IIC_SetSda(HIGHT);
                IIC_Delay(IIC_DELAYTIME);
                IIC_SetScl(LOW);
                }
bool   IIC_Send(u8 ucVal)
                {
                bool Ack;
                u16 AckLoop;
                u8 i;
                for(i=0;i<8;i++)
                {
                IIC_SetScl(LOW);
                IIC_Delay(IIC_DELAYTIME);
                IIC_SetSda((ucVal & 0x80)?TRUE:FALSE);
                IIC_Delay(IIC_DELAYTIME);
                IIC_SetScl(HIGHT);
                IIC_Delay(IIC_DELAYTIME);
                ucVal<<= 1;
                }
                IIC_SetScl(LOW);
                IIC_Delay(IIC_DELAYTIME);
                IIC_SetSda(HIGHT);
                IIC_Delay(IIC_DELAYTIME);
                IIC_SetScl(HIGHT);
                Ack = IIC_NOACK;
                for(AckLoop=0;AckLoop<ACKCHECKTIME;AckLoop++) //260us
                {
                if(!IIC_GetSdaStus())
                {
                Ack = IIC_ACK;
                break;
                }
                IIC_Delay(IIC_DELAYTIME);
                }
                IIC_SetScl(LOW);
                return Ack;                        //return success=0 / failure=1
                }
u8 IIC_Read(bool bACK)
                {
                u8 Data;
                u8 i;
                Data = 0;
                for(i=0;i<8;i++)
                {
                Data <<= 1;
                IIC_SetScl(LOW);
                IIC_Delay(IIC_DELAYTIME);
                IIC_SetSda(HIGHT);
                IIC_Delay(IIC_DELAYTIME);
                IIC_SetScl(HIGHT);
                IIC_Delay(IIC_DELAYTIME);
                if(IIC_GetSdaStus())
                Data |= 1;
                else
                Data &= 0xfe;
                }
                IIC_SetScl(LOW);
                IIC_Delay(IIC_DELAYTIME);
                IIC_SetSda(bACK);
                IIC_Delay(IIC_DELAYTIME);
                IIC_SetScl(HIGHT);
                IIC_Delay(IIC_DELAYTIME);
                IIC_SetScl(LOW);
                return Data;

                }
bool IIC_ByteWrite(u8 DeviceAdd,u8 address,u8 ucVal)
                {

       
                 IIC_Start();
                if(IIC_Send(DeviceAdd|((address>>7)&0x0e)))//NACK
                        {
                 return IIC_NOACK;
                        }
                IIC_Send((u8)(address&0xff));
                IIC_Send(ucVal);
                IIC_Stop();

                IIC_Delay(IIC_DELAYTIME);
                IIC_Delay(IIC_DELAYTIME);
                IIC_Delay(20*IIC_DELAYTIME);
               
                return IIC_ACK;
                }
u8 IIC_ByteRead(u8 DeviceAdd,u8 address)
                {
                u8 value;
               
                IIC_Start();
                IIC_Send(DeviceAdd|((address>>7)&0x0e));
                IIC_Send((u8)(address&0xff));
                IIC_Stop();
                IIC_Start();
                IIC_Send(DeviceAdd|0x01);
                value=IIC_Read(IIC_NOACK);
                IIC_Stop();
                IIC_Delay(IIC_DELAYTIME);
                IIC_Delay(IIC_DELAYTIME);
                IIC_Delay(IIC_DELAYTIME);
               
                return value;
                }
bool IIC_BytesWrite(u8 DeviceAdd,u8 address,u8 *buf,u16 nByte)
                        {
                        int lp=0;
                        for(lp=0;lp<nByte;lp++)
                                {
                                IIC_ByteWrite(DeviceAdd,lp+address,*buf++);
                                }
                         return TRUE;
                        }
bool IIC_BytesRead(u8 DeviceAdd,u8 address,u8 *buf,u16 nByte)
                        {
                        int lp=0;
                        for(lp=0;lp<nByte;lp++)
                                {
                                *buf++=IIC_ByteRead(DeviceAdd,lp+address);
                                }
                        return TRUE;
                        }

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//复用开漏输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);
这是main函数,我准备将收到的数据通过串口发出来,串口配置是没有问题的
int main(void)
{
        RCC_Configuration();
//        USART_Configuration();
        GPIO_Configuration();
        IIC_BytesWrite(0xa0,0xfe,Tx_Buffer,sizeof(Tx_Buffer)-1);
        IIC_BytesRead(0xa0,0xfe,Rx_Buffer,sizeof(Rx_Buffer)-1);
//        USART_Cmd(USART1, ENABLE);
//        USART_SendString(Tx_Buffer,sizeof(Tx_Buffer)-1);
//        USART_SendString(Rx_Buffer,sizeof(Rx_Buffer)-1);
        while (1);

}

使用特权

评论回复
7
我也是新手| | 2012-4-29 19:02 | 只看该作者
:)

使用特权

评论回复
8
optical85| | 2012-4-29 21:08 | 只看该作者
示波器看数据和地址线对不对。

使用特权

评论回复
9
optical85| | 2012-4-29 21:09 | 只看该作者
示波器看数据和地址线对不对。

使用特权

评论回复
10
PowerSource| | 2012-5-3 09:00 | 只看该作者
楼主,问题解决了吗,什么原因?

使用特权

评论回复
11
rongrong0348| | 2012-6-1 11:24 | 只看该作者
路过,学习,崩溃中……

使用特权

评论回复
12
itman-hou| | 2015-12-4 16:45 | 只看该作者
你好,问题解决了吗?我也遇到了这个问题。如果解决的话,告诉一下解决的方法。谢谢了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

35

帖子

0

粉丝