找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1221|回复: 5
收起左侧

锦锐CA51 MCU的IIC问题

[复制链接]
ID:499742 发表于 2022-11-21 19:56 | 显示全部楼层 |阅读模式
请问大神们,锦锐MCU型号CA51F551S3单片机,普通IO口做IIC通讯时,用到的IIC  引脚IO口要设置成输出还是输入呢?我用普通IO口做IIC发现驱动PT2314控制没反应,有谁用过吗?谢谢解惑。附程序
#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, 下载次数: 5

回复

使用道具 举报

ID:624769 发表于 2022-11-21 20:24 | 显示全部楼层
最好看手册,不同的器件,要求不同,
大多器件,开漏模式+ 47K 上拉都可以控制。
回复

使用道具 举报

ID:401564 发表于 2022-11-22 19:55 | 显示全部楼层
1,这个片子有硬件IIC,你可能用硬件IIC
2,虽说都是8051,但只是内核相同而已,我没有认真看,不知道端口是什么结构,并不是所有的单片机都能像STC这样,不用更改端口配置就能读写的有的单片机,要么只能读.要么只能写
你可以参考一下PIC的IIC程序,PIC的IIC是这样工作的:向从机写入数据时,先把端口设定成输出,然后再开始写入
从从机读取数据时,先把端口设定成强上拉输入模式,然后再开始读取

void Write_Byte(unsigned char Byte)                        //写入器件的应答信号由从机给出
{
        unsigned char i;
        unsigned int k=0;       
    TRISCbits.TRISC4=0;//SDA作为输出,这个是PIC把端口设置成输入的语句,不用管,知道这是更改端口配置就行了       
        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))         //超时就不再等待应答
                {
                        k++;
                        Delay();
                }                                                 //等待SDA出现低电平,出现低电平就表示器件已经应答         
        SCL=0;
}

回复

使用道具 举报

ID:499742 发表于 2022-11-22 21:09 | 显示全部楼层
Y_G_G 发表于 2022-11-22 19:55
1,这个片子有硬件IIC,你可能用硬件IIC
2,虽说都是8051,但只是内核相同而已,我没有认真看,不知道端口是什么 ...

谢谢你的回复,对我很大启发。源程序是可以读写24C02,可能PT2314硬件线路有问题。
回复

使用道具 举报

ID:401564 发表于 2022-11-23 09:13 | 显示全部楼层
金满堂 发表于 2022-11-22 21:09
谢谢你的回复,对我很大启发。源程序是可以读写24C02,可能PT2314硬件线路有问题。

我以为你没有验证过呢
如果验证过IIC程序,那么,IIC程序就是没有问题的,问题就出现在PT2314
你可以把IIC的延时改成100mS的,写入之前把一个端口拉低,写入之后再拉高,通过LED或者其它来看一下,从机有没有响应
如果从机有响应,那就是接下来的操作的问题
如果从机没响应,要么是硬件问题,要么是从机地址问题
回复

使用道具 举报

ID:499742 发表于 2022-11-23 20:00 | 显示全部楼层
Y_G_G 发表于 2022-11-23 09:13
我以为你没有验证过呢
如果验证过IIC程序,那么,IIC程序就是没有问题的,问题就出现在PT2314
你可以把IIC ...

这个芯片我以前用STC10系列做过产品的,现在搬到锦锐MCU就不行,也可能像你说的放慢点速度看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表