EV20S & EV01S 5G無線音頻模塊I2C接口與STM8與STM32通信代碼

說明

該模塊音頻傳輸使用5G通信頻率卤材,內(nèi)部集成雙向數(shù)據(jù)透?jìng)鞴δ芗暗鸵袅快o音功能扇丛,I2C端口均采用GPIO模擬的方式

STM8代碼

GPIO初始化

GPIO_Init(I2C_SCL_PORT, (GPIO_Pin_TypeDef)I2C_SCL_PINS, GPIO_MODE_OUT_OD_LOW_FAST); 
GPIO_Init(I2C_SDA_PORT, (GPIO_Pin_TypeDef)I2C_SDA_PINS, GPIO_MODE_OUT_OD_LOW_FAST);

宏定義

#define I2C_SCL_PORT    (GPIOB)
#define I2C_SCL_PINS    (GPIO_PIN_4)
#define I2C_SDA_PORT    (GPIOB)
#define I2C_SDA_PINS    (GPIO_PIN_5)

#define SDA2_IN()         {GPIOB->DDR&=~(1<<(5));(GPIOB->DDR|=(0<<(5)));}
#define SDA2_OUT()        {GPIOB->DDR&=~(1<<(5));(GPIOB->DDR|=(1<<(5)));}

#define SCL2_IN()         {GPIOB->DDR&=~(1<<(4));(GPIOB->DDR|=(0<<(4)));}
#define SCL2_OUT()        {GPIOB->DDR&=~(1<<(4));(GPIOB->DDR|=(1<<(4)));}

#define READ_SDA2               GPIO_ReadInputPin(I2C_SDA_PORT,I2C_SDA_PINS)
#define READ_SCL2               GPIO_ReadInputPin(I2C_SCL_PORT,I2C_SCL_PINS)

#define __delay_us(x)           delay_us(x*10)
#define i2c_Start()             i2c_Restart()



#define ev01s 0x68 

#define I2C_TM_SCL_HIGH     1
#define I2C_TM_SCL_LOW      3
#define I2C_TM_START_HD     24
#define I2C_TM_DATA_SU      5
#define I2C_TM_SCL_TO_DATA  5   /* SCL low to data valid */
#define I2C_TM_STOP_SU      40
#define I2C_TM_SCL_TMO      10  /* clock time out */

#define de_ack          0
#define de_non_ack      1
#define I2C_ERROR   (-1)

I2C基礎(chǔ)代碼

/*
 *  Send (re)start condition
 *    - ensure data is high then issue a start condition
 *    - see also i2c_Start() macro
 */

void
i2c_Restart(void)
{
    SCL_HIGH();                 /* ensure clock is low */
    SDA_HIGH();                 /* ensure data is high */
    __delay_us(10);

    SCL_LOW();                  /* ensure clock is low */
    SDA_HIGH();                 /* ensure data is high */

    __delay_us(I2C_TM_DATA_SU);

    SCL_HIGH();     /* clock pulse high */
    __delay_us(I2C_TM_SCL_HIGH);

    SDA_LOW();                  /* the high->low transition */
    __delay_us(I2C_TM_START_HD);
    return;
}

/*
 *  Send stop condition
 *    - data low-high while clock high
 */

void
i2c_Stop(void)
{   
    SCL_LOW();
    SDA_LOW();                  /* ensure data is low first */
    __delay_us(I2C_TM_DATA_SU);
    SCL_HIGH();     /* float clock high */
    __delay_us(I2C_TM_STOP_SU);
    SDA_HIGH();                 /* the low->high data transistion */
    
    return;
}

/*
 *  Check for an acknowledge
 *    - returns ack or ~ack, or ERROR if a bus error
 */
signed char
i2c_ReadAcknowledge(void)
{
    unsigned char ack;
    SCL_LOW();                      /* make clock is low */
    __delay_us(I2C_TM_SCL_TO_DATA); /* SCL low to data out valid */
    SDA_HIGH();
    if(fg_i2c_ev01s)
    {
        __delay_us(50);//50
    }
    else
    {
        __delay_us(5);
    }
    SCL_HIGH();
    __delay_us(I2C_TM_DATA_SU);
    SDA2_IN();  //SDA設(shè)置為輸入
    ack = READ_SDA2;                        /* read the acknowledge */
    SDA2_OUT();
    return ack;
}


/*
 *  Send a byte to the slave
 *    - returns true on error
 */
unsigned char
i2c_SendByte(unsigned char byte)
{
    signed char i;
    for(i=7; i>=0; i--)
    {
    SCL_LOW();                  /* drive clock low */

        if ((byte>>i)&0x01)
    {       /* bit to send */
            SDA_HIGH();
        }
        else 
        {
            SDA_LOW();
        }
    
            __delay_us(3);              
        SCL_HIGH();
        __delay_us(I2C_TM_SCL_HIGH);    /* clock high time */
    }
    
    return FALSE;
}

/*
 *  wait for the clock line to be released by slow slaves
 *    - returns TRUE if SCL was not released after the
 *      time out period.
 *    - returns FALSE if and when SCL released
 */
unsigned char
i2c_WaitForSCL(void)
{
    SCL2_IN();
    /* SCL_DIR should be input here */
    if(!READ_SCL2)
    {
        __delay_us(I2C_TM_SCL_TMO);
        /* if the clock is still low -> bus error */
        if(!READ_SCL2){
            SCL2_OUT();
            return TRUE;
        }
    }
    SCL2_OUT();
    return FALSE;
}

/*
 *  Read a byte from the slave
 *    - returns the byte, or I2C_ERROR if a bus error
 */
int
i2c_ReadByte(void)
{
    unsigned char i;
    unsigned char byte = 0;
    unsigned char x;
    SCL_LOW();
    if(fg_i2c_ev01s)
    {
        __delay_us(50);//50
    }
    for(i=0; i<8; i++)
    {
        SCL_LOW();                  /* drive clock low */
        __delay_us(1);  /* min clock low  period */
        SDA_HIGH();     /* release data line */
        __delay_us(1);
        SCL_HIGH();     /* float clock high */
        __delay_us(1);  /* min clock low  period */
        if(i2c_WaitForSCL())
            return I2C_ERROR;
        __delay_us(1);
        byte = byte << 1;       /* read the next bit */
        SDA2_IN();
        //x=READ_SDA2&0x01;
                if(READ_SDA2)
                {
                  x=0x01;
                }
                else
                {
                  x=0x00;
                }
        SDA2_OUT();
        byte |=x;
    }
    return (int)byte;
}

/*
 *  send an address and data direction to the slave
 *    - 7-bit address (lsb ignored)
 *    - direction (FALSE = write )
 */
unsigned char
i2c_SendAddress(unsigned char address, unsigned char rw)
{
    return i2c_SendByte(address | (rw?1:0));
}

/*
 *  Opens communication with a device at address. mode
 *  indicates I2C_READ or I2C_WRITE.
 *    - returns TRUE if address is not acknowledged
 */
unsigned char
i2c_Open(unsigned char address, unsigned char mode)
{
    i2c_Start();
    i2c_SendAddress(address, mode);
    if(i2c_ReadAcknowledge()) 
        return TRUE;

    return FALSE;
}

/*
 *  Send an (~)acknowledge to the slave
 *    - status of I2C_LAST implies this is the last byte to be sent
 */
void
i2c_SendAcknowledge(unsigned char status)
{
    SCL_LOW();
    if ( status & 0x01) {
        SDA_LOW();              /* drive line low -> more to come */
    }else { 
        SDA_HIGH();
    }
    __delay_us(I2C_TM_DATA_SU);
    SCL_HIGH();     /* float clock high */
    __delay_us(3);
    return;
}

/*
 *  Get a byte from the slave and acknowledges the transfer
 *    - returns true on I2C_ERROR or byte
 */
int
i2c_GetByte(unsigned char more)
{
    int byte;

    if((byte = i2c_ReadByte()) == I2C_ERROR)
        return I2C_ERROR;

    i2c_SendAcknowledge(more);

    return byte;
}

/*
 *  Send a byte to the slave and acknowledges the transfer
 *    - returns I2C_ERROR, ack or ~ack
 */
signed char
i2c_PutByte(unsigned char data)
{
//  if(i2c_SendByte(data))
//      return I2C_ERROR;

    i2c_SendByte(data);
    return i2c_ReadAcknowledge();   /* returns ack, ~ack */
}

void i2c_send_dada(unsigned char A,unsigned char B,unsigned char C)
{
        disableInterrupts();
    unsigned char f=5;
    if(fg_i2c_ev01s)
    {
        f=50;
    }
    __delay_us(f);
    i2c_Open(A,0);
    i2c_PutByte(B);
    i2c_PutByte(C);
    i2c_Stop();
        enableInterrupts(); 
}
//************************************************
//*       I2C check data                         *
//************************************************
void i2c_read_dada(unsigned char a,unsigned char b,unsigned char c)
{
    unsigned char z=0;
    unsigned char y;
    unsigned char t;
    t=5;
        disableInterrupts();
    if(fg_i2c_ev01s)
    {
        t=50;
    }
    __delay_us(t);
    i2c_Open(a,0);
    i2c_PutByte(b);
    if(a==ev01s)
    {
        i2c_Stop();
    }
    __delay_us(t);
    i2c_Open(a,1);
    for(;z<c;z++)
    {
        y=de_non_ack;
        if((z+1)==c)
        {
            y=de_ack;
        }
        ev01s_rcv_buf[z]=i2c_GetByte(y);
    }
    i2c_Stop(); 
        enableInterrupts();
}

注意:模塊對(duì)i2C時(shí)序有一定要求购啄,具體可參考數(shù)據(jù)手冊(cè)

STM32代碼

GPIO初始化

void IIC2_Init(void)
{
    GPIO_InitPara GPIO_InitStructure;
    RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_8 | GPIO_PIN_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT;   //推挽輸出
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_OD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB, GPIO_PIN_8 | GPIO_PIN_9);
}
/*模塊接收中斷,外部中斷線初始化*/
void ev01s_it_Init(void)
{
    EXTI_InitPara EXTI_InitStructure;
    GPIO_InitPara GPIO_InitStructure;
    NVIC_InitPara NVIC_InitStructure;

    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_CFG, ENABLE);//使能外部中斷時(shí)鐘

    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN;    //推挽輸出
    GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_PULLUP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    SYSCFG_EXTILine_Config(EXTI_SOURCE_GPIOB, EXTI_SOURCE_PIN0);    

    EXTI_InitStructure.EXTI_LINE = EXTI_LINE0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     //配置中斷模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; 
    EXTI_InitStructure.EXTI_LINEEnable = ENABLE;            //使能中斷
    EXTI_Init(&EXTI_InitStructure); 
    
    NVIC_PRIGroup_Enable(NVIC_PRIGROUP_3);

    NVIC_InitStructure.NVIC_IRQ = EXTI0_1_IRQn;
    NVIC_InitStructure.NVIC_IRQPreemptPriority = 2;//優(yōu)先級(jí)
    NVIC_InitStructure.NVIC_IRQSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQEnable = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

宏定義

//IO方向設(shè)置
#define SDA2_IN()  {GPIOB->CTLR&=~(3<<(9*2));GPIOB->CTLR|=0<<9*2;}   
#define SDA2_OUT() {GPIOB->CTLR&=~(3<<(9*2));GPIOB->CTLR|=1<<9*2;}
#define SCL2_IN()  {GPIOB->CTLR&=~(3<<(8*2));GPIOB->CTLR|=0<<8*2;}   
#define SCL2_OUT() {GPIOB->CTLR&=~(3<<(8*2));GPIOB->CTLR|=1<<8*2;}


//IO操作函數(shù)
#define IIC2_SCL(x)      (x==0)?GPIO_ResetBits(GPIOB, GPIO_PIN_8):GPIO_SetBits(GPIOB, GPIO_PIN_8)//    PBout(8) //SCL
#define IIC2_SDA(x)      (x==0)?GPIO_ResetBits(GPIOB, GPIO_PIN_9):GPIO_SetBits(GPIOB, GPIO_PIN_9)//    PBout(9) //SDA    
#define READ_SDA2               GPIO_ReadInputBit(GPIOB,GPIO_PIN_9)//PBin(9) //輸入SDA
#define READ_SCL2               GPIO_ReadInputBit(GPIOB,GPIO_PIN_8)//PBin(8) //輸入SCL

#define SCL_LOW()           IIC2_SCL(0)
#define SCL_HIGH()      IIC2_SCL(1)

#define SDA_HIGH()      IIC2_SDA(1)
#define SDA_LOW()           IIC2_SDA(0)

#define ev01s 0x68 

#define I2C_TM_SCL_HIGH     1
#define I2C_TM_SCL_LOW      3
#define I2C_TM_START_HD     24
#define I2C_TM_DATA_SU      5
#define I2C_TM_SCL_TO_DATA  5   /* SCL low to data valid */
#define I2C_TM_STOP_SU      40
#define I2C_TM_SCL_TMO      10  /* clock time out */

#define de_ack          0
#define de_non_ack      1
#define I2C_ERROR   (-1)

#define __delay_us(x)   delay_us(x*10)
#define i2c_Start()     i2c_Restart()

I2C基礎(chǔ)代碼與上方STM8幾乎一致

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辉川,一起剝皮案震驚了整個(gè)濱河市乓旗,隨后出現(xiàn)的幾起案子集索,更是在濱河造成了極大的恐慌,老刑警劉巖妆距,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娱据,死亡現(xiàn)場(chǎng)離奇詭異盅惜,居然都是意外死亡忌穿,警方通過查閱死者的電腦和手機(jī)结啼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朴译,“玉大人属铁,你說我怎么就攤上這事焦蘑。” “怎么了坟乾?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵甚侣,是天一觀的道長(zhǎng)间学。 經(jīng)常有香客問我,道長(zhǎng)详羡,這世上最難降的妖魔是什么嘿悬? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮善涨,結(jié)果婚禮上窒盐,老公的妹妹穿的比我還像新娘。我一直安慰自己钢拧,他們只是感情好蟹漓,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著源内,像睡著了一般葡粒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天嗽交,我揣著相機(jī)與錄音伯铣,去河邊找鬼轮纫。 笑死腔寡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掌唾。 我是一名探鬼主播放前,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼糯彬!你這毒婦竟也來了凭语?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤撩扒,失蹤者是張志新(化名)和其女友劉穎似扔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搓谆,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炒辉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泉手。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黔寇。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斩萌,靈堂內(nèi)的尸體忽然破棺而出缝裤,到底是詐尸還是另有隱情,我是刑警寧澤颊郎,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布憋飞,位于F島的核電站,受9級(jí)特大地震影響姆吭,放射性物質(zhì)發(fā)生泄漏榛做。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一猾编、第九天 我趴在偏房一處隱蔽的房頂上張望瘤睹。 院中可真熱鬧,春花似錦答倡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春倔既,著一層夾襖步出監(jiān)牢的瞬間恕曲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工渤涌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佩谣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓实蓬,卻偏偏與公主長(zhǎng)得像茸俭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子安皱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容

  • 參考鏈接:http://blog.csdn.net/sweetsnow24/article/details/863...
    Tony1213閱讀 4,454評(píng)論 0 0
  • 在使用單片機(jī)的過程中调鬓,I2C 通信可以說是最被廣泛使用和采納的協(xié)議之一,采用 I2C 協(xié)議可以占用更少的資源酌伊,鏈接...
    noparkinghere閱讀 2,177評(píng)論 0 8
  • IIC通信實(shí)驗(yàn) IIC簡(jiǎn)介 I2C(Inter-Integrated Circuit)字面上的意思是集成電路之間腾窝,...
    btskyrmb閱讀 1,927評(píng)論 0 2
  • 01 原本開朗的晚晴這兩天很忐忑,懷孕后居砖,照冬就不見了虹脯。未婚先孕,私定終身這樣的字眼放在這個(gè)小漁村奏候,應(yīng)是眾矢之的了...
    宋小蔥閱讀 328評(píng)論 0 5
  • 抽象類與接口 抽象類和接口似乎在功能上沒什么區(qū)別归形,主要作用都是為了規(guī)范類的行為。然而鼻由,既然同時(shí)存在這兩種概念暇榴,那必...
    白犬定春閱讀 520評(píng)論 2 6