原子例程i2c驱动收音机芯片AKC6955 失败 求教

2019-07-21 06:30发布

大家好 我是初学者 在做一个i2c驱动收音机芯片的简单程序 直接移植原子例程 但是失败了

时序图如下

i2c选的pb6 pb7
#define SDA_IN()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}

//IO&#178;&#217;×÷&#186;&#175;&#202;&#253;     
#define IIC_SCL    PCout(7) //SCL
#define IIC_SDA    PCout(6) //SDA     
#define READ_SDA   PCin(6)  //&#202;&#228;&#200;&#235;SDA


void IIC_Init(void)
{                        
    GPIO_InitTypeDef GPIO_InitStructure;
    //RCC->APB2ENR|=1<<4;//&#207;&#200;&#202;&#185;&#196;&#220;&#205;&#226;&#201;èIO PORTC&#202;±&#214;&#211;
    RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOB, ENABLE );   
      
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ;   //&#205;&#198;&#205;ì&#202;&#228;&#179;&#246;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    IIC_SCL=1;
    IIC_SDA=1;

}



我的写寄存器代码

void i2c_write(u8 DEVICE_ID, u8 reg, u8 val)
{
    IIC_Start();
    IIC_Send_Byte(0b00100000);
    IIC_Ack();
    IIC_Send_Byte(reg);
    IIC_Ack();
    IIC_Send_Byte(val);
    IIC_Ack();
    IIC_Stop();

}

板子没问题  接在Arduino可以用



谢谢大家


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
sudywolf
1楼-- · 2019-07-21 10:03
搞定了

#define IIC_SCL    PCout(7) //SCL
#define IIC_SDA    PCout(6) //SDA     
#define READ_SDA   PCin(6)  //&#202;&#228;&#200;&#235;SDA
这里错了 应该是PB
sudywolf
2楼-- · 2019-07-21 12:07
还是不对

#define IIC_SCL    PBout(9) //SCL
#define IIC_SDA    PBout(8) //SDA         
#define READ_SDA   PBin(8)  //&#202;&#228;&#200;&#235;SDA

SDA设为PB8

#define SDA_IN()  {GPIOB->CRH&=0XFFFFFFF0;GPIOB->CRH|=8;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFFFFF0;GPIOB->CRH|=3;}


读函数始终不对 只有0
u8 i2c_read(u8 DEVICE_ID, u8 reg)
{
        u8 c=0;
        IIC_Start();
        IIC_Send_Byte(DEVICE_ID);
        IIC_Ack();
        IIC_Send_Byte(reg);
        IIC_Ack();
        IIC_Stop();
       
        IIC_Start();
        IIC_Send_Byte(DEVICE_ID | 1);
        u8 e= IIC_Wait_Ack();
        Gui_StrCenter(0, 190, BLACK, RED, (e?"Error":"OK") ,16, 0);
        c = IIC_Read_Byte();
        e=IIC_Wait_Ack();
        Gui_StrCenter(0, 210, BLACK, RED, (e?"Error":"OK") ,16, 0);
        IIC_Stop();
        return c;
}


请高手帮我看看时序 对不对


两个IIC_Wait_Ack 换成 IIC_Ack也不对

一周热门 更多>