12
返回列表 发新帖
楼主: 功夫崽崽

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

[复制链接]

该用户从未签到

3

主题

23

帖子

0

注册会员

Rank: 2

积分
164
最后登录
2021-10-7
 楼主| 发表于 2021-9-19 22:37:36 | 显示全部楼层
本帖最后由 功夫崽崽 于 2021-9-19 22:51 编辑
小恩GG 发表于 2021-9-15 15:16
同样程序如果默认用PTB6、PTB7外部上拉是否可以?
通过SIM_PINSEL|=SIM_PINSEL_I2C0PS_MASK;切换到PTA2和PT ...

修改 ICS_C1 = 0x06;  可以读写了,     BIT2: IREFS = 0; 是外部时钟参考选择,导致 PB7_I2C_SCL 引脚不能输出。
但是有遇到个新问题,写完24C08 0x0000地址 又写0x0010 地址的时候新数据没有写成功,写的还是0x0000地址的数据。 见下图

kea_i2c.jpg
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

23

帖子

0

注册会员

Rank: 2

积分
164
最后登录
2021-10-7
 楼主| 发表于 2021-9-19 22:52:31 | 显示全部楼层
功夫崽崽 发表于 2021-9-19 22:37
修改 ICS_C1 = 0x06;  可以读写了,     BIT2: IREFS = 0; 是外部时钟参考选择,导致 PB7_I2C_SCL 引脚不 ...

I2C0-D  没有置上新的数据呢!  

i2c111.png
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

23

帖子

0

注册会员

Rank: 2

积分
164
最后登录
2021-10-7
 楼主| 发表于 2021-9-20 09:32:45 | 显示全部楼层
功夫崽崽 发表于 2021-9-19 22:52
I2C0-D  没有置上新的数据呢!

没有写进新的数据是因为 BUSY信号没有被清掉。  在写完 A5 最后一个字节 置 STOP信号 没有清除 busy。
在stop前稍加 nop(); 延时 busy就清掉了,  但是没有写成功,仅接着度出来的都是 FF
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

23

帖子

0

注册会员

Rank: 2

积分
164
最后登录
2021-10-7
 楼主| 发表于 2021-9-20 13:38:19 | 显示全部楼层
本帖最后由 功夫崽崽 于 2021-9-20 13:52 编辑

1,结合“ 小恩GG” 的帮助,找到PB7 没有输出的原因,初始化内部晶振时 ICS->C1 = 0x02; 选择了外部晶振参考  改成0x06,  PB7 可以输出了;
2,PB7 可以输出后 数据有不正确的(最初参看这个贴子 https://www.nxpic.org.cn/module/ ... 54911&highlight=i2c );
3,连续写第二次的时候写失败,应该是逻辑上设置错误,参照官方demo 修改为以下代码,测试通过;
3-1:写函数

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;
   
      mI2C_Wait_TC(pI2Cx);
      pI2Cx->C1 |= 0x10;                                    //I2C_TxEnable(pI2Cx);
   
        pI2Cx->D = (0xA0 | i);
   
      mI2C_Wait(pI2Cx);                   //0x02
      mI2C_WaitAck(pI2Cx);                //
   
      mI2C_Wait_TC(pI2Cx);
        pI2Cx->D = (u16SlaveAddress % 256);
      mI2C_Wait(pI2Cx);
      mI2C_WaitAck(pI2Cx);

        while(u16Length--)
        {
              mI2C_Wait_TC(pI2Cx);
                pI2Cx->D = (* pWrBuff);
                mI2C_Wait(pI2Cx);
                mI2C_WaitAck(pI2Cx);
              
                pWrBuff++;
        }
        mI2C_Stop(pI2Cx);
        
        I2C_Delay_nop(100);
        
        return 0x00;
}

3-2:读函数
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;
   
      mI2C_Wait_TC(pI2Cx);
      pI2Cx->C1 |= 0x10;                                    //I2C_TxEnable(pI2Cx);
   
        pI2Cx->D = (0xA0 | i);
      mI2C_Wait(pI2Cx);
      mI2C_WaitAck(pI2Cx);
   
      mI2C_Wait_TC(pI2Cx);
        pI2Cx->D = (u16SlaveAddress % 256);
      mI2C_Wait(pI2Cx);                        
      mI2C_WaitAck(pI2Cx);
   
      mI2C_Wait_TC(pI2Cx);
        mI2C_ReStart(pI2Cx);
        
      pI2Cx->D = (0xA1 | i);
      mI2C_Wait(pI2Cx);
      mI2C_WaitAck(pI2Cx);
        
      mI2C_Wait_TC(pI2Cx);
        pI2Cx->C1 &= ~0x10;                                //I2C_RxEnable(pI2Cx);
        mI2C_SendAck(pI2Cx);              //TXAK=1
    dummyRead = pI2Cx->D;             //空读,启动接收        
      mI2C_Wait(pI2Cx);

        while(u16Length)
        {
               
              mI2C_Wait_TC(pI2Cx);
//             *pRdBuff = pI2Cx->D;   
//              mI2C_Wait(pI2Cx);
            
        if(u16Length == 1)
                {
                        mI2C_SendNack(pI2Cx);
                      //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(100);
        
        return dummyRead;
}

//

void AT24C08_WriteData(uint8_t *p,uint16_t addr,uint16_t len)
{
        uint16_t i;
        
        if((len > 1024) || ((len % 16) != 0) || (addr > 0x0400))
        {
                return;
        }
        for(i=0;i<len;i+=16)
        {
              mI2C_MasterWriteBuffer_24C08(I2C0,addr,&p,16);
        }
}

void AT24C08_ReadData(uint8_t *p,uint16_t addr,uint16_t len)
{
        uint16_t i;
   
        if((len > 1024) || ((len % 16) != 0) || (addr > 0x0400))
        {
                return;
        }   
        for(i=0;i<len;i+=16)
        {
                mI2C_MasterReadBuffer_24C08(I2C0,addr,&p,16);
        }
}

4:测试,连续写1024个字节的 AA,再读出来,入下图;








24c08_testOk.jpg
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-4-26 06:24 , Processed in 0.127231 second(s), 24 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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