新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM8S105S4 I2C

        STM8S105S4 I2C

        作者: 時間:2016-12-02 來源:網絡 收藏
        STM8S105S4 I2C這樣配置可以從機發數據,從機接數據就不行,是什么問題
        //I2C端口初始化
        GPIO_Init(GPIOE,GPIO_PIN_1|GPIO_PIN_2, GPIO_MODE_OUT_OD_HIZ_SLOW);
        void I2C_init(void)
        {
        I2C_CCRH = 0; //標準I2C接口
        I2C_CCRL = 80 ;
        I2C_FREQR = 16;
        I2C_OARL = (I2CAddr<<1);
        I2C_OARH= 0x40;
        I2C_ITR =0x06;
        I2C_CR1 =0x01;
        I2C_CR2 |=0x04;
        }
        @far @interrupt void I2C_Handler (void)
        {
        u8 state1,state2,state3;
        state1 = I2C_SR1;
        state2 = I2C_SR2;
        state3 = I2C_SR3;
        //地址匹配
        if((state1&0x02)!=0){I2C_CR2 |= 0x04;}
        //接收到數據,需要處理
        if( (state1& 0x40) != 0)
        {
        I2C_CR2|= 0x04;
        temp1= I2C_DR;
        SetOutput(temp1);
        }
        //從機需要發送數據
        if((state1 & 0x80) != 0)
        {
        I2C_DR = num++;
        }
        if((state2 & 0x04) != 0)I2C_SR2 &= ~0x04; //應答失敗,清除該位
        if((state1 & 0x10) != 0)
        {
        I2C_CR2 = 0x02;
        }
        }
        我寫成這樣子,發現現在是從機發數據是沒問題,從機接收數據不行,沒有進入中斷。

        成功傳輸一次正確的數據后就進不去了。程序還正常運行

        本文引用地址:http://www.104case.com/article/201612/325048.htm

        #define I2CAddr 0x01
        在主機
        //主機寫數據,從機接,這個不行
        Soft_I2C_Start();
        Soft_I2C_Write(0x02);
        Soft_I2C_Write(0xAA);
        Soft_I2C_Stop();
        //主機接收數據。沒有運行上一段程序,主機可以接收數據,運行上段,主機接收數據都是255
        Soft_I2C_Start();
        Soft_I2C_Write(0x03);
        var0=Soft_I2C_Read(1);
        Soft_I2C_Stop();
        這個軟I2C在控制其它設備是沒有問題的,主機用的芯片是STM32。應該是沒有問題的

        解決問題:

        這就是了,你第一次成功后了,你把應答給關掉了,還怎么接收啊。。。以后配寄存器要多一個心眼才是。

        問題就在這里I2C_CR2 = 0x02; 修改為I2C_CR2 |= 0x02;原因是修改了,第一次成功后,沒有再回復

        1.PC0,PC1初始化,GPIO_Init(GPIOC, GPIO_Pin_1 | GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Fast);
        2.必須連接硬件
        3.總線不能busy,一定要空閑
        初始化代碼如下:
        GPIO_Init(GPIOC, GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Slow);
        GPIO_Init(GPIOC, GPIO_Pin_1, GPIO_Mode_Out_OD_HiZ_Slow);
        CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);
        I2C_Init(I2C1, 50000, 0xA5, I2C_Mode_I2C, I2C_DutyCycle_2,
        I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);
        //注:I2C_Init()里已經使能了I2C,所以可以不用I2C_Cmd(I2C1, ENABLE);
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

        stm8 自帶I2C終于調試成功。

        1,此次調試I2C受益多多,首先證明官方的那個寫EEPROM的程序是對的。
        2,這次調試TW8816開始調不通的原因是誤以為寄存器地址是16位的(芯片公司的業務也是這么說的,我相信了),才讓我看到的數據不同,但我想,有數據了,而且用WHILE等待的方法,程序跑通了,說明連上了從機。
        3, I2C的GPIO不要配置,我看到有些同仁把GPIO配置了。
        4,為了大家用好STM8的I2C,我把程序烤下來。

        void IIC_Init(void)
        {
        UCHAR temp;

        CLK_PCKENR1 |= 0x01;

        I2C_FREQR |= 0x10; //輸入外設時鐘頻率為1MHz
        I2C_CR1 = 0x00; //禁止I2C外設
        I2C_CCRH&= ~0xcf;
        I2C_CCRL&= ~0xff;
        I2C_TRISER = 0x11;
        I2C_CCRL = 0x10;
        I2C_CCRH = 0x00;
        I2C_CR1 |= 0x01; //開啟I2C外設
        I2C_CR2 |= 0x04; //當前接收字節返回應答
        I2C_CR2 &= 0x08;
        I2C_OARL = 0x86; //自身地址
        I2C_OARH = 0x40;
        }

        void Read_8816(UCHAR *pBuffer, UCHAR index, UCHAR NumByteToRead)
        {
        UCHAR temp;

        while(I2C_SR3 & 0x02); //等待總線空閑
        I2C_CR2 |= 0x01; //產生起始位
        while(!(I2C_SR1 & 0x01)); //等待START發送完
        I2C_DR = 0x8a; //發送8816器件地址
        while(!(I2C_SR1 & 0x02)); //等特7位器件地址發送完
        temp = I2C_SR1;
        temp = I2C_SR3;
        I2C_DR = (UCHAR)(index);
        while(!(I2C_SR1 & 0x84));

        I2C_CR2 |= 0x01; //產生重復起始位
        while(!(I2C_SR1 & 0x01)); //等待START發送完
        I2C_DR = 0x8b; //讀
        while(!(I2C_SR1 & 0x02)); //等特7位器件地址發送完
        temp = I2C_SR1;
        temp = I2C_SR3;
        while(NumByteToRead) //要讀幾個字節
        {
        if(NumByteToRead == 1)
        {
        I2C_CR2 &= ~0x04; //不返回應答
        I2C_CR2 |= 0x02; //產生停止位
        }
        if(I2C_SR1 & 0x40)
        {
        temp = I2C_SR1;
        Buff[8-NumByteToRead]=I2C_DR;
        *pBuffer = Buff[8-NumByteToRead];
        pBuffer++;
        NumByteToRead--;
        }
        }
        I2C_CR2 |= 0x04;
        I2C_CR2 &= ~0x08; //為下一次接收使能應答
        }



        關鍵詞: STM8S105S4I2

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 陇西县| 抚顺市| 长阳| 德阳市| 汕头市| 东兰县| 祁连县| 当涂县| 习水县| 景谷| 同江市| 东明县| 祁连县| 澄城县| 横山县| 财经| 明星| 昌都县| 遂溪县| 九江县| 阿拉善左旗| 隆昌县| 鱼台县| 呼玛县| 彰武县| 双柏县| 永丰县| 竹北市| 株洲市| 永康市| 瑞丽市| 阿鲁科尔沁旗| 海原县| 厦门市| 库尔勒市| 松江区| 宁国市| 渝中区| 黔江区| 延川县| 同德县|