打印
[STM32F0]

关于STM32F051模拟驱动HL9576

[复制链接]
1779|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dwlovehome|  楼主 | 2014-10-16 09:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
是这样的,用到了HL9576,用STM32F051的IO口模拟IIC驱动这个片子,结果发现要么就是不显示,要么就是感觉地址不对,
SCLK 用的是PB10,SDA用的是PB11 ,下面是我的驱动和显示。不知道这个有没有问题,大牛们给看看
void Init_HL9576(void)
{
        IIC_Start();
        IIC_Send_Byte(0x70); //器件地址
        IIC_Wait_Ack();
        IIC_Send_Byte(0xd8); //工作模式 省电模式
        IIC_Wait_Ack();
        IIC_Send_Byte(0xf0); //不闪烁命令
        IIC_Wait_Ack();
        for(i=0;i<20;i++)        //清屏
                IIC_Send_Byte(0x00);
        IIC_Wait_Ack();
        IIC_Stop();
}
void DisPlayDate(void)
{
        u8 i=0;
        IIC_Start();   
        IIC_Send_Byte(0x70); //发送被控器件总线地址
        IIC_Wait_Ack();
        IIC_Send_Byte(0xd8); //工作模式 省电模式
        IIC_Wait_Ack();
        IIC_Send_Byte(0x00); //首位地址 0开始
        IIC_Wait_Ack();
        for(i=0;i<5;i++)     //前5个地址全部点亮
                IIC_Send_Byte(0xff);
        IIC_Wait_Ack();
        IIC_Stop();
}


//下面是我的IIC
#define IIC_SDA_OUT_HIGH         GPIO_SetBits(GPIOB,GPIO_Pin_11)              
#define IIC_SDA_OUT_LOW          GPIO_ResetBits(GPIOB,GPIO_Pin_11)
#define IIC_SCL_OUT_HIGH        GPIO_SetBits(GPIOB,GPIO_Pin_10)
#define IIC_SCL_OUT_LOW         GPIO_ResetBits(GPIOB,GPIO_Pin_10)
#define        READ_IIC_SDA                        (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11))
//初始化IIC
void IIC_Init(void)
{                                             
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
        
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;                        //输出模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                        //推挽输出
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;                                //上拉模式
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10|GPIO_Pin_11;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void IIC_SDA_IO_OUT(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;                        //输出模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                        //推挽输出
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;                                //上拉模式
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void IIC_SDA_IO_IN(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;                        //输入模式
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                        //输入模式下无效
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;//GPIO_PuPd_UP;                                //上拉模式
        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11;               
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

//开始IIC
void IIC_Start(void)
{
        IIC_SDA_IO_OUT();//SDA???
        IIC_SDA_OUT_HIGH;              
        IIC_SCL_OUT_HIGH;
        delay_us(8);
        IIC_SDA_OUT_LOW;//START:when CLK is high,DATA change form high to low
        delay_us(4);
        IIC_SCL_OUT_LOW;//钳住I2C总线,准备发送或接收数据
}         
//停止IIC
void IIC_Stop(void)
{
        IIC_SDA_IO_OUT();//sda线输出
        IIC_SCL_OUT_LOW;
        IIC_SDA_OUT_LOW;//STOP:when CLK is high DATA change form low to high
        delay_us(8);
        IIC_SCL_OUT_HIGH;
        IIC_SDA_OUT_HIGH;
        delay_us(4);                                                                  
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;

        IIC_SDA_OUT_HIGH;delay_us(1);           
        IIC_SCL_OUT_HIGH;delay_us(1);        
        
        IIC_SDA_IO_IN();      //SDA输入
        while(READ_IIC_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL_OUT_LOW;//时钟输出0
        IIC_SDA_IO_OUT();
        return 0;  
}
//产生ACK应答
void IIC_Ack(void)
{
        IIC_SCL_OUT_LOW;
        IIC_SDA_IO_OUT();
        IIC_SDA_OUT_LOW;
        delay_us(8);
        IIC_SCL_OUT_HIGH;
        delay_us(4);
        IIC_SCL_OUT_LOW;
}
//不产生ACK应答            
void IIC_NAck(void)
{
        IIC_SCL_OUT_LOW;
        IIC_SDA_IO_OUT();
        IIC_SDA_OUT_HIGH;
        delay_us(8);
        IIC_SCL_OUT_HIGH;
        delay_us(4);
        IIC_SCL_OUT_LOW;
}                                                                              
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答                          
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
                IIC_SDA_IO_OUT();         
    IIC_SCL_OUT_LOW;//拉低时钟开始数据传输
                delay_us(4);
    for(t=0;t<8;t++)
    {   
      if(txd&0x80)
        IIC_SDA_OUT_HIGH;
      else
                                IIC_SDA_OUT_LOW;
      txd<<=1;           
                        delay_us(8);   //?TEA5767?3????????
                        IIC_SCL_OUT_HIGH;
                        delay_us(4);
                        IIC_SCL_OUT_LOW;        
                        delay_us(4);
    }         
}            
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
  unsigned char i,receive=0;
  IIC_SDA_IO_IN();//SDA设置为输入
  for(i=0;i<8;i++ )
  {
    IIC_SCL_OUT_LOW;
    delay_us(4);
    IIC_SCL_OUT_HIGH;

    receive<<=1;
    if(READ_IIC_SDA)
      receive++;   
    delay_us(2);
   }               
        
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
                IIC_SDA_IO_OUT();
                delay_us(4);        
    return receive;
}
沙发
mmuuss586| | 2014-10-16 12:13 | 只看该作者
没用过这个芯片;
找厂家要有没有参考代码;
可以借助示波器分析下时序是否正确;

使用特权

评论回复
板凳
airwill| | 2014-10-16 18:48 | 只看该作者
关于 I2C 通信,首先不建议使用模拟方式。
由于从机在 “来不及”响应命令的时候, 可能通过锁在 SCL 线。在用示波器验证波形的时候,你最好将不连接从机和连接从机分开验证。

使用特权

评论回复
地板
dwlovehome|  楼主 | 2014-10-16 22:05 | 只看该作者
mmuuss586 发表于 2014-10-16 12:13
没用过这个芯片;
找厂家要有没有参考代码;
可以借助示波器分析下时序是否正确; ...

我同一条线上还挂着一个24C64,我的24C64读写都没有问题

使用特权

评论回复
5
dwlovehome|  楼主 | 2014-10-16 22:07 | 只看该作者
airwill 发表于 2014-10-16 18:48
关于 I2C 通信,首先不建议使用模拟方式。
由于从机在 “来不及”响应命令的时候, 可能通过锁在 SCL 线。 ...

嗯,但是我模拟的时候,我把延时放的很大也不行。。同一条IIC上面我挂的24C64就没有问题。固件库的IIC还没用过

使用特权

评论回复
6
bhkjcg| | 2014-10-21 15:34 | 只看该作者
长期供应ST  STM32F103   STM8S207 系列   如STM32F103C8T6  STM32F103RBT6   STM32F103ZET6  STM32F103VET6等电子元器件 有需要联系

使用特权

评论回复
7
zh113214| | 2014-10-27 21:47 | 只看该作者
bhkjcg 发表于 2014-10-21 15:34
长期供应ST  STM32F103   STM8S207 系列   如STM32F103C8T6  STM32F103RBT6   STM32F103ZET6  STM32F103VET ...

好的 !!

使用特权

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

本版积分规则

8

主题

41

帖子

0

粉丝