查看: 1999|回复: 13

[求助] keazn64 硬件 i2c SCL SDA 上没有输出 !!!

[复制链接]

该用户从未签到

3

主题

23

帖子

0

注册会员

Rank: 2

积分
164
最后登录
2021-10-7
发表于 2021-9-11 08:21:26 | 显示全部楼层 |阅读模式
本帖最后由 功夫崽崽 于 2021-9-11 17:28 编辑

keazn64 硬件 i2c 驱动 24c08 问题   ,  PTB6-I2C0_SDA,PTB7-I2C0_SCL   用示波器观察IO上没有输出。  参照“KEA64RM” 参考手册  P124“Table 10-1. Pin availability by package pin-count”    在 ALT2 上。  KEAZN64 没看到有相关的配置啊。  不知道问题出现在哪里, 求指导一下。  


void AT24C08_Init(void)
{
        sGPIO_Init(GPIOA,PTB6 | PTB7,GPIO_Mode_OUT,GPIO_PuPd_NOPULL);      //PTB6-I2C0_SDA,PTB7-I2C0_SCL 这句IO配置应该没用,keazn64没    有描述 OD怎么配置
        SIM->PINSEL |= 0x00000020;                                                                 //I2C0_SCL and I2C0_SDA are mapped on PTB7 and PTB6, respectively.
        mI2C_Init(I2C0);
}

void mI2C_Init(I2C_Type *pI2Cx)
{
       SIM->SCGC  |= 0x00020000;                                        //BIT 17
      
       pI2Cx->C1  |= 0x80;                                                    //Enable I2C

       pI2Cx->F    = (uint8_t)0x1F;                                         //I2C_SetBaudRate(pI2Cx,pI2CConfig->u16F);
}


//以下操作 参照 “https://www.nxpic.org.cn/module/forum/thread-554911-1-1.html” 此帖

uint8_t mI2C_MasterWriteBuffer_24C08(I2C_Type *pI2Cx,uint16_t u16SlaveAddress,uint8_t *pWrBuff,uint16_t u16Length)
{
        uint16_t i;
   
        mI2C_Start(pI2Cx);
   
        i = u16SlaveAddress >> 8;
        i <<= 1;
   
        pI2Cx->D = (0xA0 | i);
      mI2C_Wait(pI2Cx);
      mI2C_WaitAck(pI2Cx);
        pI2Cx->D = (u16SlaveAddress % 256);
      mI2C_Wait(pI2Cx);
      mI2C_WaitAck(pI2Cx);

        while(u16Length--)
        {
                pI2Cx->D = (* pWrBuff);
                mI2C_Wait(pI2Cx);
                mI2C_WaitAck(pI2Cx);
              
                pWrBuff++;
        }
        mI2C_Stop(pI2Cx);
        
        I2C_Delay_nop(500);
        
        return 0x00;
}
   
uint8_t mI2C_MasterReadBuffer_24C08(I2C_Type *pI2Cx,uint16_t u16SlaveAddress,uint8_t *pRdBuff,uint16_t u16Length)
{
        uint8_t dummyRead;
        uint16_t i;
   
        mI2C_Start(pI2Cx);
   
        i = u16SlaveAddress >> 8;
        i <<= 1;
   
        pI2Cx->D = (0xA0 | i);
      mI2C_Wait(pI2Cx);
      mI2C_WaitAck(pI2Cx);
        pI2Cx->D = (u16SlaveAddress % 256);
      mI2C_Wait(pI2Cx);                        
      mI2C_WaitAck(pI2Cx);
   
      I2C_Delay_nop(500);
   
      mI2C_ReStart(pI2Cx);
   
      pI2Cx->D = (0xA1 | i);
      mI2C_Wait(pI2Cx);
      mI2C_WaitAck(pI2Cx);
        
        pI2Cx->C1 &= ~0x10;                       //接收
        mI2C_SendNack(pI2Cx);             //TXAK=1
        
        dummyRead = pI2Cx->D;             //空读,启动接收
      mI2C_Wait(pI2Cx);
      //mI2C_WaitAck(pI2Cx);

        while(u16Length)
        {
//             *pRdBuff = pI2Cx->D;
//               
//              mI2C_Interrupt(pI2Cx);
            
                if(u16Length == 1)
                {   
                        mI2C_Stop(pI2Cx);                //读取最后一个字节先发stop
                }else
                {
                        mI2C_SendAck(pI2Cx);
                }
               
             *pRdBuff = pI2Cx->D;
               
              mI2C_Wait(pI2Cx);               
            
                pRdBuff++;
                u16Length--;
        }
        mI2C_SendNack(pI2Cx);                    //mI2C_Stop(pI2Cx);
        I2C_Delay_nop(500);
        
        return dummyRead;
}

最佳答案

同样程序如果默认用PTB6、PTB7外部上拉是否可以? 通过SIM_PINSEL|=SIM_PINSEL_I2C0PS_MASK;切换到PTA2和PTA3之后就没法正确输出了吗? 是否试过PTA2、3配置成IO口输出高低?(判断是否还是被更高优先级的EXTAL和XTA ...
回复

使用道具 举报

该用户从未签到

3

主题

23

帖子

0

注册会员

Rank: 2

积分
164
最后登录
2021-10-7
 楼主| 发表于 2021-9-11 17:18:39 | 显示全部楼层
int main(void)
{
          uint8_t eBuf[EEPROM_SIZE];

          Bsp_Init();
       
          GetChipUniqueID();
       
          printf("Usart0 Send Hello kea ! \r\n");       

          memset(eBuf,0xA5,sizeof(eBuf));
          mI2C_MasterWriteBuffer_24C08(I2C0,0x0000,&eBuf[0],16);
          memset(eBuf,0x00,sizeof(eBuf));
          mI2C_MasterReadBuffer_24C08 (I2C0,0x0000,&eBuf[0],16);
          
          printf("Go to main ! \r\n");
          while(1);
}
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

23

帖子

0

注册会员

Rank: 2

积分
164
最后登录
2021-10-7
 楼主| 发表于 2021-9-11 17:20:15 | 显示全部楼层
SCL 上没有 时钟输出;
SDA 上没有数据变化;
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

23

帖子

0

注册会员

Rank: 2

积分
164
最后登录
2021-10-7
 楼主| 发表于 2021-9-11 17:23:43 | 显示全部楼层
本帖最后由 功夫崽崽 于 2021-9-12 09:07 编辑

上面调用的子函数

uint8_t mI2C_Start(I2C_Type *pI2Cx)
{
    uint32_t u32Timeout;
    uint8_t u8ErrorStatus;
   
    u32Timeout = 0;
    u8ErrorStatus = 0x00;

    pI2Cx->C1 |= 0x10;//I2C_C1_TX_MASK;//I2C_TxEnable(pI2Cx);
    pI2Cx->C1 |= 0x20;//I2C_C1_MST_MASK;    主

    while( (!(pI2Cx->S & 0x20)) && ( u32Timeout < I2C_WAIT_STATUS_TIMEOUT)) //BUSY
    {
       u32Timeout ++;
    }

     if( u32Timeout == I2C_WAIT_STATUS_TIMEOUT )
     {
        u8ErrorStatus |= I2C_ERROR_START_NO_BUSY_FLAG;
     }

     return u8ErrorStatus;
}

uint8_t mI2C_ReStart(I2C_Type *pI2Cx)
{
    pI2Cx->C1 |= 0x04;
        
    return 0;
}

*****************************************************************************/
uint8_t mI2C_Stop(I2C_Type *pI2Cx)
{
    uint32_t u32Timeout;
    uint8_t u8ErrorStatus;
   
    u32Timeout = 0;
    u8ErrorStatus = 0x00;
   
    pI2Cx->C1 &= ~I2C_C1_MST_MASK;

    while( (pI2Cx->S & 0x20 ) && ( u32Timeout < I2C_WAIT_STATUS_TIMEOUT))
    {
       u32Timeout ++;
    }

    if( u32Timeout == I2C_WAIT_STATUS_TIMEOUT )
    {
       u8ErrorStatus |= I2C_ERROR_STOP_BUSY_FLAG;
    }

     return u8ErrorStatus;
}

void mI2C_SendNack(I2C_Type *pI2Cx )
{
    pI2Cx->C1 |= 0x08;//I2C_C1_TXAK_MASK;
}

void mI2C_SendAck(I2C_Type *pI2Cx )
{
    pI2Cx->C1 &= ~0x08;//I2C_C1_TXAK_MASK;
}

uint8_t mI2C_WaitAck(I2C_Type *pI2Cx )
{
                uint32_t u32Timeout;
                uint8_t u8ErrorStatus;
        
    u32Timeout = 0;
    while (((pI2Cx->S & 0x01) !=  0x01)                  //RXAK =0 ACK
         && (u32Timeout<I2C_WAIT_STATUS_TIMEOUT))
    {
        u32Timeout ++;
    }
    if (u32Timeout >= I2C_WAIT_STATUS_TIMEOUT)
    {
        u8ErrorStatus |= I2C_ERROR_NO_GET_ACK;
        return u8ErrorStatus;
    }

                return 0;
}

uint8_t mI2C_Wait(I2C_Type *pI2Cx )
{
                uint32_t u32Timeout;
          uint8_t u8ErrorStatus;
        
    while (((pI2Cx->S & 0x02) !=  0x02)                  //I2C_S_IICIF_MASK    等待应答
         && (u32Timeout<I2C_WAIT_STATUS_TIMEOUT))
    {
        u32Timeout ++;
    }
    if (u32Timeout >= I2C_WAIT_STATUS_TIMEOUT)
    {
        u8ErrorStatus |= I2C_ERROR_NO_WAIT_IICIF_FLAG;
        return u8ErrorStatus;
    }

    pI2Cx->S |= 0x02;                   /* clear IICIF flag */
               
                return 0;
}
回复 支持 反对

使用道具 举报

  • TA的每日心情
    慵懒
    2021-12-23 09:57
  • 签到天数: 1587 天

    [LV.Master]伴坛终老

    5

    主题

    3046

    帖子

    23

    金牌会员

    Rank: 6Rank: 6

    积分
    8201
    最后登录
    2024-4-17
    发表于 2021-9-13 12:25:29 | 显示全部楼层
    官网有evb的例程的,自己找一下吧。
    外部上拉有没有?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    23

    帖子

    0

    注册会员

    Rank: 2

    积分
    164
    最后登录
    2021-10-7
     楼主| 发表于 2021-9-13 20:32:58 | 显示全部楼层
    Splore.Liu 发表于 2021-9-13 12:25
    官网有evb的例程的,自己找一下吧。
    外部上拉有没有?

    有上拉,10K  谢谢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    19991
    最后登录
    2024-4-23
    发表于 2021-9-14 18:55:21 | 显示全部楼层

    楼主你好
    KEA系列没有寄存器直接为引脚选择某个Alt功能,且Alt 4功能XTAL和EXTAL的优先级高于Alt 2的I2C功能。
    所以恐怕你得关闭OSC,否则没法使用这组引脚
    OSC_CR[OSCEN]
    Table 10-1. Pin availability by package pin-count.png
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    23

    帖子

    0

    注册会员

    Rank: 2

    积分
    164
    最后登录
    2021-10-7
     楼主| 发表于 2021-9-15 07:57:15 | 显示全部楼层
    小恩GG 发表于 2021-9-14 18:55
    楼主你好
    KEA系列没有寄存器直接为引脚选择某个Alt功能,且Alt 4功能XTAL和EXTAL的优先级高于Alt 2的I2C功 ...

    ok  谢谢  我试一下。  能有波形输出就好办了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    23

    帖子

    0

    注册会员

    Rank: 2

    积分
    164
    最后登录
    2021-10-7
     楼主| 发表于 2021-9-15 08:05:28 | 显示全部楼层
    小恩GG 发表于 2021-9-14 18:55
    楼主你好
    KEA系列没有寄存器直接为引脚选择某个Alt功能,且Alt 4功能XTAL和EXTAL的优先级高于Alt 2的I2C功 ...

    void INTCLK_Init(void)
    {
        OSC->CR = 0x00;          
        //FEI模式   
        ICS->C1 = 0x02;              //ICSOUT = 31.25*1024=32M          RDIV=000 31.25kHz to 39.0625kHz
        //ICS->C3 = 0x90;                                /*Reference clock frequency = 31.25 KHz*/   //The FLL loop        locks the frequency to 1024 times the internal reference frequency.
        while ((ICS->S & ICS_S_LOCK_MASK) == 0);       
        ICS->C2 = 0x20;              //BDIV=1         
        while ((ICS->S & ICS_S_IREFST_MASK) == 0);
      
        //NOTE: If user want to use 40 MHz core clock, this bit need clear to 000b after     SIM_BUSDIV[BUSDIV]=1.
        SIM->BUSDIV = 1 ;                  //32M BUS Clock = ICSOUT/2 16M
        ICS->C2 = 0x00;                                //BDIV=1             
           
        ICS->S |= ICS_S_LOLS_MASK;                   /* Clear Loss of lock sticky bit */
    }


    看了一下程序,刚一进主程序就配置了内部系统时钟,查看了寄存器的 OSC_EN=0。     之前实验过外部时钟,成功后就屏蔽了,一直用的内部时钟。    还有可能是什么地方的原因?   谢谢  
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    19991
    最后登录
    2024-4-23
    发表于 2021-9-15 15:16:36 | 显示全部楼层
    同样程序如果默认用PTB6、PTB7外部上拉是否可以?
    通过SIM_PINSEL|=SIM_PINSEL_I2C0PS_MASK;切换到PTA2和PTA3之后就没法正确输出了吗?
    是否试过PTA2、3配置成IO口输出高低?(判断是否还是被更高优先级的EXTAL和XTAL占用着)
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-24 01:16 , Processed in 0.164625 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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