標(biāo)題: 錦銳CA51 MCU的IIC問題 [打印本頁(yè)]

作者: 金滿堂    時(shí)間: 2022-11-21 19:56
標(biāo)題: 錦銳CA51 MCU的IIC問題
請(qǐng)問大神們,錦銳MCU型號(hào)CA51F551S3單片機(jī),普通IO口做IIC通訊時(shí),用到的IIC  引腳IO口要設(shè)置成輸出還是輸入呢?我用普通IO口做IIC發(fā)現(xiàn)驅(qū)動(dòng)PT2314控制沒反應(yīng),有誰用過嗎?謝謝解惑。附程序
#include "ca51f5sfr.h"
#include "gpiodef_f5.h"
#include "delay.h"
#include "i2c.h"

#define scl                  P02
#define sda                  P03


#define AddWr 0xa0//e  
#define AddRd 0xa1//f  

void   iic_delay(void)
{
    unsigned char i=15;//12
    while(i--);
}
//******************************************************************

unsigned char ACK(void)
{
   unsigned char time_1;
    sda=1;
          iic_delay();
    scl=0;
    iic_delay();
    scl=1;
          iic_delay();
    time_1=10;
    while(sda)
    {
                time_1--;
                if (!time_1)
                 {
                   scl=0;
       iic_delay();
                   return 0;
                 }
        } //ACK
    scl=0;
        iic_delay();

        return 1;
}
//*******************************************************************

void NOACK(void)
{
    sda=1;
          iic_delay();
    scl=1;
    iic_delay();
    scl=0;
    iic_delay();
}
/*
void ACK_2(void)
{
    sda=0;
        iic_delay();
    scl=1;
    iic_delay();
    scl=0;
    iic_delay();
}
*/
//*********************************************************************
void start(void)  
{        
        sda=1;
        iic_delay();
        scl=1;
        iic_delay();
        sda=0;
        iic_delay();
        scl=0;
        iic_delay();
  }
//*********************************************************************
void stop(void)  
{
        sda=0;
        iic_delay();
        scl=1;
        iic_delay();
        sda=1;
        iic_delay();
        scl=1;  
        iic_delay();
}


void  write_8bit(unsigned char dat)
{
    unsigned char i=8;

    scl=0;
        iic_delay();
    while (i--)
    {
                                M_LED = ~M_LED;
        sda=(bit)(dat&0x80);
        iic_delay();
        dat<<=1;
        scl=1;
                iic_delay();
        scl=0;
        iic_delay();
    }
}


unsigned char  read_8bit(void)
{
   unsigned char k;
         unsigned char i=8;

    scl=0;
          sda=1;
    iic_delay();

    while (i--)
    {
                                M_LED = ~M_LED;
        scl=1;
        iic_delay();
        k=(k<<1)|sda;
        iic_delay();
        scl=0;
                iic_delay();
    }
        return k;
}


void WrToROM(unsigned char Address,unsigned char Data)
{
   start();
   write_8bit(AddWr);   
   ACK();
   write_8bit(Address);
   ACK();
   write_8bit(Data);
   ACK();
   stop();
   Delay_50us(2);

}


unsigned char RdFROM(unsigned char Address)
{
   unsigned char Date;

   start();   
   write_8bit(AddWr);
   ACK();
   write_8bit(Address);
   ACK();
   start();
   write_8bit(AddRd);  
   ACK();
   (Date)=read_8bit();
   NOACK();
   stop();
   return Date;


功放CA51.rar

297.08 KB, 下載次數(shù): 5


作者: 188610329    時(shí)間: 2022-11-21 20:24
最好看手冊(cè),不同的器件,要求不同,
大多器件,開漏模式+ 47K 上拉都可以控制。
作者: Y_G_G    時(shí)間: 2022-11-22 19:55
1,這個(gè)片子有硬件IIC,你可能用硬件IIC
2,雖說都是8051,但只是內(nèi)核相同而已,我沒有認(rèn)真看,不知道端口是什么結(jié)構(gòu),并不是所有的單片機(jī)都能像STC這樣,不用更改端口配置就能讀寫的有的單片機(jī),要么只能讀.要么只能寫
你可以參考一下PIC的IIC程序,PIC的IIC是這樣工作的:向從機(jī)寫入數(shù)據(jù)時(shí),先把端口設(shè)定成輸出,然后再開始寫入
從從機(jī)讀取數(shù)據(jù)時(shí),先把端口設(shè)定成強(qiáng)上拉輸入模式,然后再開始讀取

void Write_Byte(unsigned char Byte)                        //寫入器件的應(yīng)答信號(hào)由從機(jī)給出
{
        unsigned char i;
        unsigned int k=0;       
    TRISCbits.TRISC4=0;//SDA作為輸出,這個(gè)是PIC把端口設(shè)置成輸入的語句,不用管,知道這是更改端口配置就行了       
        for(i=0;i<8;i++)
                         {                               
                                if(Byte&0x80)SDA=1;
                                else SDA=0;
                                Delay();
                                SCL=1;
                                Delay();
                                SCL=0;
                                Delay();                                               
                                Byte<<=1;
                        }
    TRISCbits.TRISC4=1;//SDA作為輸入
        SCL=1;
        Delay();       
        SDA=1;       
        while((SDA==1)&&(k<1000))         //超時(shí)就不再等待應(yīng)答
                {
                        k++;
                        Delay();
                }                                                 //等待SDA出現(xiàn)低電平,出現(xiàn)低電平就表示器件已經(jīng)應(yīng)答         
        SCL=0;
}


作者: 金滿堂    時(shí)間: 2022-11-22 21:09
Y_G_G 發(fā)表于 2022-11-22 19:55
1,這個(gè)片子有硬件IIC,你可能用硬件IIC
2,雖說都是8051,但只是內(nèi)核相同而已,我沒有認(rèn)真看,不知道端口是什么 ...

謝謝你的回復(fù),對(duì)我很大啟發(fā)。源程序是可以讀寫24C02,可能PT2314硬件線路有問題。
作者: Y_G_G    時(shí)間: 2022-11-23 09:13
金滿堂 發(fā)表于 2022-11-22 21:09
謝謝你的回復(fù),對(duì)我很大啟發(fā)。源程序是可以讀寫24C02,可能PT2314硬件線路有問題。

我以為你沒有驗(yàn)證過呢
如果驗(yàn)證過IIC程序,那么,IIC程序就是沒有問題的,問題就出現(xiàn)在PT2314
你可以把IIC的延時(shí)改成100mS的,寫入之前把一個(gè)端口拉低,寫入之后再拉高,通過LED或者其它來看一下,從機(jī)有沒有響應(yīng)
如果從機(jī)有響應(yīng),那就是接下來的操作的問題
如果從機(jī)沒響應(yīng),要么是硬件問題,要么是從機(jī)地址問題
作者: 金滿堂    時(shí)間: 2022-11-23 20:00
Y_G_G 發(fā)表于 2022-11-23 09:13
我以為你沒有驗(yàn)證過呢
如果驗(yàn)證過IIC程序,那么,IIC程序就是沒有問題的,問題就出現(xiàn)在PT2314
你可以把IIC ...

這個(gè)芯片我以前用STC10系列做過產(chǎn)品的,現(xiàn)在搬到錦銳MCU就不行,也可能像你說的放慢點(diǎn)速度看看




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1