查看: 4978|回复: 10

[求助] 请教下在K64上使用I2C的问题

[复制链接]

该用户从未签到

7

主题

22

帖子

0

注册会员

Rank: 2

积分
139
最后登录
2016-9-29
发表于 2015-12-17 10:04:16 | 显示全部楼层 |阅读模式
大家好,
我现在使用I2C的时候碰到了些问题,就是我发出的I2C波形总是一样的,并不是我想发出的数,我用的是I2C_DRV_MasterSendDataBlocking(chan, &device,NULL, 0,pdata, 1, 200);这个函数,但是不管我怎么改变pdata的值,I2C的波形发出来的都是只有启动和截止位,中间全是零
电路板没有问题,我用了frdmk64f的实例程序“i2c_blocking_master_example_frdmk64f 也是这样的,发送的数值pdata怎么改,发出的波形都是如下图
845430229803416912.jpg

我的代码是基于KSDK1.2,运行在MQX4.2上的,编译环境是KDS3.0
编码如下,请帮我看看哪里有问题?
void main_task( task_param_t init_data ){

    _task_id                 rx_tid;
    _task_id                 tx_tid;
    TASK_PARAMS              task_p = {0};
    uint8_t result = 0;
    uint8_t temp;

    hardware_init();
    OSA_Init();
    button_init();

    i2c_init(0);

    uint8_t i;
    uint8_t length = 10;
    uint8_t data[length];
    for(i = 0;i<length;i++){
    data = i;
    }

    while(1){
    i2c_sendbuf(0,data,length);
    _time_delay(5);
    };

}


_WEAK_FUNCTION(void hardware_init(void)) {
    uint8_t i;


    /* enable clock for PORTs */
    for (i = 0; i < PORT_INSTANCE_COUNT; i++)
    {
      CLOCK_SYS_EnablePortClock(i);
    }


    /* Init board clock */
    BOARD_ClockInit();
    /* In case IO sub is turned off, dbg console should be used for printing */
#if !BSPCFG_ENABLE_IO_SUBSYSTEM
    dbg_uart_init(); //wangyufei
#endif
}


void i2c_init(uint8_t chan){


    uint32_t i = 0;
    // i2c master state
    i2c_master_state_t master;
    // i2c device configuration

    configure_i2c_pins(0);
    configure_i2c_pins(1);
    // Initialize i2c master
    I2C_DRV_MasterInit(0, &master);
    I2C_DRV_MasterInit(1, &master);
}




int i2c_sendbuf(uint8_t chan,uint8_t *data,uint8_t length)
{
    uint32_t i = 0;
    i2c_status_t status1;
    uint8_t pdata[10];
    for(i = 0; i < DATA_LENGTH; i++)
    {
        txBuff = i + 1;
    }

    uint8_t result;

    for(i = 0;i<10;i++)
    pdata = i+3;

    pdata[0] = 0x80;
    pdata[1] = 0xF3;

    result = I2C_DRV_MasterSendDataBlocking(chan, &device,
                        pdata, 1,pdata, 2, 200);

        // Delay to wait slave received data
    OSA_TimeDelay(10);
    // _time_delay(5);

    pdata[0] = 0x81;
    result = I2C_DRV_MasterSendDataBlocking(chan, &device,
                        pdata, 1,pdata, 1, 200);

    // Clear rxBuff
    for(i = 0; i < count; i++)
    {
        rxBuff = 0;
    }

    // Master receives count byte data from slave
    result = I2C_DRV_MasterReceiveDataBlocking(chan, &device,
                                              NULL, 0, rxBuff, 1, 200);

    OSA_TimeDelay(5);
}

我知道答案 目前已有10人回答
回复

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-12-17 13:52:44 | 显示全部楼层
楼主,你好!
我刚看了下FRDM-K64的KSDK I2C 代码:
C:\Freescale\KSDK_1.3.0\examples\frdmk64f\driver_examples\i2c\i2c_blocking
也就是使用
        I2C_DRV_MasterSendDataBlocking(BOARD_I2C_INSTANCE, &device,
                        (const uint8_t*)&count, 1, (const uint8_t*)txBuff, count, 1000);
这里你要注意下,这个函数每次都会先发一个自己的地址,后面才是数据字节。
也就是,如果count=1, 那么实际上发的是两个字节,第一个是地址字节,由device结构体配置,
    i2c_device_t device =
    {
      .address = 0x7FU,
      .baudRate_kbps = 400   // 400 Kbps
    };
发送的时候,address还要左移一位,也就是发0XFF。
第二个字节才是真正的数据字节。
所以,你这边看到的实际上是地址字节,还没有看到后面的数据字节。
而且发多字节的时候,一定要注意连上从机,因为如果没有从机的ACK的话,后面的数据字节就不会发送,只会发一个地址字节就结束了。
如果连上从机,并且接到地址字节后,回了ACK,函数才会继续发下面的数据字节。
更多详情,你可以用两个K64板子链接,然后分别烧录主机,从机,抓取I2C总线上的通信数据。
虽然上面讲的不是MQX的,是bare board的,但是对于KSDK里面的I2C_DRV_MasterSendDataBlocking函数,是一样的。
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

3

主题

57

帖子

0

注册会员

Rank: 2

积分
143
最后登录
2016-1-27
发表于 2015-12-17 12:38:52 | 显示全部楼层
帮顶  有点难度
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2016-10-25 09:15
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    13

    主题

    430

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1385
    最后登录
    2018-6-13
    发表于 2015-12-17 12:47:01 | 显示全部楼层
    估计是你没有配置好
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2015-12-17 13:57:22 | 显示全部楼层
    这里给出我的测试波形,发一个字节,主从机连接:
    PNG_2015121714838.png
    如果从机不连接,第一个地址字节是NACK,不会有后面的数据字节了。

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-6 07:38
  • 签到天数: 736 天

    连续签到: 1 天

    [LV.9]以坛为家II

    21

    主题

    3486

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    5093
    最后登录
    2024-1-7
    发表于 2015-12-17 15:54:58 | 显示全部楼层
    学习一下,版主回答的很到位
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11

    主题

    343

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1260
    最后登录
    2017-11-6
    发表于 2015-12-17 21:20:27 | 显示全部楼层
    我觉得FSL_TICS_ZJJ的解释应该是正理
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-5-9 08:12
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    34

    主题

    801

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2367
    最后登录
    2021-8-11
    发表于 2015-12-18 08:24:16 | 显示全部楼层
    FSL_TICS_ZJJ 发表于 2015-12-17 13:57
    这里给出我的测试波形,发一个字节,主从机连接:

    如果从机不连接,第一个地址字节是NACK,不会有后面的数 ...

    这是用的示波器吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    22

    帖子

    0

    注册会员

    Rank: 2

    积分
    139
    最后登录
    2016-9-29
     楼主| 发表于 2015-12-18 09:20:08 | 显示全部楼层
    FSL_TICS_ZJJ 发表于 2015-12-17 13:57
    这里给出我的测试波形,发一个字节,主从机连接:

    如果从机不连接,第一个地址字节是NACK,不会有后面的数 ...

    是这样的,昨天已经搞定了,地址应该是需要右移一位,因为函数里面会做左移一位的操作~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2015-12-18 10:00:49 | 显示全部楼层
    modou0 发表于 2015-12-18 08:24
    这是用的示波器吗?

    我给出的波形是示波器的,你也可以使用逻辑分析仪。
    数据多的时候,肯定用逻辑分析仪方便,可以直接查看包数据。
    示波器就需要自己一个一个看,而且抓取数据有限。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-24 02:46 , Processed in 0.109217 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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