打印

I2C的一些疑问。大家帮忙看看。

[复制链接]
4767|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kyzb001|  楼主 | 2010-11-11 15:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用NUC100控制AT88SC0104,我写了2段代码,一个为收,一个是发。(为了方便检测哪里出错)2个代码返回的状态寄存器的值都显示正确的,但是读回来的数据是错误的。麻烦大家看看代码。帮小弟个忙。

#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvI2C.h"
#include "DrvSYS.h"
#include "DrvUART.h"
#define LEN 8
#define ADDRESS 0X59
int32_t main()
{
uint32_t get;
//串口初始化程序,为了便于大家观看就剪切了。
DrvGPIO_InitFunction(E_FUNC_I2C0);
DrvI2C_Open(I2C_PORT0, 100000);
DrvI2C_Ctrl(I2C_PORT0,1, 0, 0, 0);
while(I2C0->CON.SI==0);
printf("\n%x\n",I2C0->STATUS);

I2C0->DATA=0xd9<<1 | 0x01;
DrvI2C_Ctrl(I2C_PORT0,0, 0, 1, 0);
while(I2C0->CON.SI==0);
printf("\n%x\n",I2C0->STATUS);

DrvI2C_Ctrl(I2C_PORT0,0, 0, 1, 1);
while(I2C0->CON.SI==0);
printf("\n%x\n",I2C0->STATUS);

get=I2C0->DATA;
DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1);
while(I2C0->CON.SI==0);
printf("\n%d\n",get);

DrvI2C_Close(I2C_PORT0);
}

这个是读0104 芯片的数据的上述几个状态寄存器的值分别输出为(16进制) 8  40 50
但是读出的数据全部是225
下面是写数据的代码
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvI2C.h"
#include "DrvSYS.h"
#include "DrvUART.h"
#define LEN 8
#define ADDRESS 0X59
int32_t main()
{
//串口初始化程序,为了便于大家观看就剪切了。
DrvGPIO_InitFunction(E_FUNC_I2C0);
DrvI2C_Open(I2C_PORT0, 100000);

DrvI2C_Ctrl(I2C_PORT0,1, 0, 0, 0);
while(I2C0->CON.SI==0);
printf("\n%x\n",I2C0->STATUS);

I2C0->DATA=0xd9<<1;
DrvI2C_Ctrl(I2C_PORT0,0, 0, 1, 0);
while(I2C0->CON.SI==0);
printf("\n%x\n",I2C0->STATUS);

I2C0->DATA=0x89;
DrvI2C_Ctrl(I2C_PORT0,0, 0, 1, 1);
while(I2C0->CON.SI==0);
printf("\n%x\n",I2C0->STATUS);

DrvI2C_Close(I2C_PORT0);


}
而这三个状态寄存器分别输出的值是 8 18 28;
请教一下大家,为什么状态寄存器的值返回的都是正确的,而读出的数据确实错误的。 是我写那块代码有错误还是读哪一块有错误。
万分感谢大家。

相关帖子

沙发
hotpower| | 2010-11-11 15:55 | 只看该作者
俺认为华邦的i2c例程很一般,根本不符合nxp的规范…

使用特权

评论回复
板凳
kyzb001|  楼主 | 2010-11-11 16:25 | 只看该作者
这个我自己写的。 嘿嘿   
请问下,你看出哪里有问题了没!

使用特权

评论回复
地板
hotpower| | 2010-11-11 18:15 | 只看该作者
i2c有个回调函数的例程接近nxp的规范,还凑合

使用特权

评论回复
5
txcy| | 2010-11-11 18:17 | 只看该作者
我也碰到了类似的问题,还在查错中。。。

使用特权

评论回复
6
kyzb001|  楼主 | 2010-11-11 19:58 | 只看该作者
谢谢大家。 我也正在加油测试中。
我正在弄回调函数的那个。

使用特权

评论回复
7
bit6019| | 2010-11-11 19:59 | 只看该作者
我也正在学这个,但是还没成功

使用特权

评论回复
8
kyzb001|  楼主 | 2010-11-11 20:01 | 只看该作者
一起加油哈, 弄好了 教教我 ,假设我弄好了  我就贴上来。

使用特权

评论回复
9
hotpower| | 2010-11-11 20:18 | 只看该作者
俺在nxp的m0用的很好,楼主可以自己搜索:“i2c hotpower”

使用特权

评论回复
10
kyzb001|  楼主 | 2010-11-11 20:57 | 只看该作者
好的 ,非常感谢。

使用特权

评论回复
11
kyzb001|  楼主 | 2010-11-11 23:06 | 只看该作者
本帖最后由 kyzb001 于 2010-11-11 23:08 编辑

我应该是读到数据了。 单是貌似读的地址有问题。 不知道是发送的时候有问题还是读取的时候有问题。 明天弄。
代码我改了。小菜鸟一个,代码不好,高手见谅。
发送代码:::
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include <stdio.h>
#include "Driver\DrvGPIO.h"
#include "Driver\DrvI2C.h"
#include "Driver\DrvSYS.h"
#include "Driver\DrvUART.h"

uint8_t Device_Addr0;
uint8_t Tx_Data0;
uint8_t DataLen0;
volatile uint8_t EndFlag0 = 0;
void I2C0_Callback_Tx(uint32_t status)
{
        if (status == 0x08)                                                /* 发送启动信号 */
        {
                DrvI2C_WriteData(I2C_PORT0, Device_Addr0);
                DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 0);
                printf("start \n");
        }        
        else if (status == 0x18)                                /* SLA+W has been transmitted and ACK has been received */
        {                                                                                                                                                                                
                DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 0);

        }
        else if (status == 0x20)                                /* SLA+W has been transmitted and NACK has been received */
        {               
                DrvI2C_Ctrl(I2C_PORT0, 1, 1, 1, 0);
                printf("stop \n");
        }        
        else if (status == 0x28)                                /* DATA has been transmitted and ACK has been received */
        {
                DrvI2C_WriteData(I2C_PORT0, Tx_Data0);
                DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 0);
                EndFlag0 = 1;
                //printf("send data %d  \n",Tx_Data0);        
        }
        else
        {
                printf("Status 0x%x is NOT processed\n", status);
        }               
}
int32_t main (void)
{
        uint32_t i;
        STR_UART_T sParam;
   
        UNLOCKREG();
    SYSCLK->;PWRCON.XTL12M_EN = 1;
    DrvSYS_Delay(5000);
        DrvGPIO_InitFunction(E_FUNC_UART0);
        DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0);

    sParam.u32BaudRate                 = 115200;
    sParam.u8cDataBits                 = DRVUART_DATABITS_8;
    sParam.u8cStopBits                 = DRVUART_STOPBITS_1;
    sParam.u8cParity                 = DRVUART_PARITY_NONE;
    sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES;

        DrvUART_Open(UART_PORT0, &sParam);
        printf("\nuart open \n");
    DrvGPIO_InitFunction(E_FUNC_I2C0);
        
        DrvI2C_Open(I2C_PORT0, 10000);
        DrvI2C_EnableInt(I2C_PORT0);               
        DrvI2C_Ctrl(I2C_PORT0, 1, 0, 0, 0);
        Device_Addr0 = 0xa0;        
        for (i = 0; i < 32; i++)
        {
                Tx_Data0= 0x10 + i;
                EndFlag0 = 0;               
                DrvI2C_InstallCallback(I2C_PORT0, I2CFUNC, I2C0_Callback_Tx);
                //DrvI2C_Ctrl(I2C_PORT0, 1, 0, 0, 0);
                while (EndFlag0 == 0);
                printf("send data %d  \n",Tx_Data0);
                EndFlag0 = 0;                        
        }
        printf("I2C0(Master) to I2C1(Slave) Test OK\n");
        DrvI2C_DisableInt(I2C_PORT0);
        DrvI2C_Close(I2C_PORT0);
        while(1);
}




接收代码:::
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include <stdio.h>
#include "Driver\DrvGPIO.h"
#include "Driver\DrvI2C.h"
#include "Driver\DrvSYS.h"
#include "Driver\DrvUART.h"

/*---------------------------------------------------------------------------------------------------------*/
/* Global variables                                                                                        */
/*---------------------------------------------------------------------------------------------------------*/
uint8_t Device_Addr0;
volatile uint8_t EndFlag0 = 0,cou = 0;
uint8_t  Slave_Buff1[32] = {0};



/*---------------------------------------------------------------------------------------------------------*/
/*  I2C0 (Master) Rx Callback Function                                                                                                           */
/*---------------------------------------------------------------------------------------------------------*/
void I2C0_Callback_Rx(uint32_t status)
{
        if (status == 0x08)                                                   /* START已经发送并且准备发送SLA+W */
        {
                DrvI2C_WriteData(I2C_PORT0, Device_Addr0);
                DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 0);
                printf("\nStar is success\n");
        }        
        else if (status == 0x10)                                /* 已经发送重新启动并且准备发送 SLA+R */
        {
                DrvI2C_WriteData(I2C_PORT0, Device_Addr0);
                DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 0);
               
        }
        else if (status == 0x40)                                /* SLA+R已经发送并且 ACK已经接收 */
        {        
                DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1);
        }
                else if (status == 0x50)                                /* 数据已经发送并且ACK已经返回 */
        {
                Slave_Buff1[cou++] = DrvI2C_ReadData(I2C_PORT0);
                DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1);
                EndFlag0 = 1;
        }               
        else if (status == 0x58)                                /* 数据已经发送并且NACK已经返回 */
        {
                Slave_Buff1[cou++] = DrvI2C_ReadData(I2C_PORT0);
                DrvI2C_Ctrl(I2C_PORT0, 0, 1, 1, 0);
                EndFlag0 = 1;
                printf("\n Over \n");
        }
        else
        {
                printf("Status 0x%x is NOT processed\n", status);
        }                        
}
int32_t main (void)
{
        uint32_t i;
        STR_UART_T sParam;
   
        UNLOCKREG();
    SYSCLK->;PWRCON.XTL12M_EN = 1;
    DrvSYS_Delay(5000);
        DrvGPIO_InitFunction(E_FUNC_UART0);
        DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0);

    sParam.u32BaudRate                 = 115200;
    sParam.u8cDataBits                 = DRVUART_DATABITS_8;
    sParam.u8cStopBits                 = DRVUART_STOPBITS_1;
    sParam.u8cParity                 = DRVUART_PARITY_NONE;
    sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES;

        DrvUART_Open(UART_PORT0, &sParam);
        printf("\nuart open \n");
    DrvGPIO_InitFunction(E_FUNC_I2C0);
        
        DrvI2C_Open(I2C_PORT0, 10000);
        DrvI2C_EnableInt(I2C_PORT0);               
        DrvI2C_Ctrl(I2C_PORT0, 1, 0, 0, 0);
        Device_Addr0 = 0xa1;        
        for (i = 0; i < 32; i++)
        {        
                EndFlag0 = 0;               
                DrvI2C_InstallCallback(I2C_PORT0, I2CFUNC, I2C0_Callback_Rx);
                while (EndFlag0 == 0);                        
        }
        DrvI2C_DisableInt(I2C_PORT0);
        printf("\nLoad data finish\n");
        for(i = 0; i < 32; i++)
        {
                 printf("\n %d   \n",Slave_Buff1);
        }
        printf("I2C0(Master) to I2C1(Slave) Test OK\n");
        
        DrvI2C_Close(I2C_PORT0);
        while(1);
}

使用特权

评论回复
12
kyzb001|  楼主 | 2010-11-11 23:09 | 只看该作者
uart open

Star is success

Load data finish

25   

25   

25   

25   

25   

25   

26   

26   

26   

26   

26   

26   

26   

26   

26   

26   

26   

26   

26   

26   

27   

27   

27   

27   

27   

27   

27   

27   

27   

27   

27   

27   
I2C0(Master) to I2C1(Slave) Test OK

每次上电,数字都会加(芯片内部地址+1)
接收到的数据在串口上显示

使用特权

评论回复
13
kyzb001|  楼主 | 2010-11-11 23:11 | 只看该作者
uart open
start
start  0
send data 16  
send data 17  
send data 18  
send data 19  
send data 20  
send data 21  
send data 22  
send data 23  
send data 24  
send data 25  
send data 26  
send data 27  
send data 28  
send data 29  
send data 30  
send data 31  
send data 32  
send data 33  
send data 34  
send data 35  
send data 36  
send data 37  
send data 38  
send data 39  
send data 40  
send data 41  
send data 42  
send data 43  
send data 44  
send data 45  
send data 46  
send data 47  
I2C0(Master) to I2C1(Slave) Test OK
发送代码发出的数据在串口上的显示

使用特权

评论回复
14
kyzb001|  楼主 | 2010-11-11 23:12 | 只看该作者
自己睡觉前顶一个。 一个人摸索,希望各位大哥们帮个忙。 菜鸟一个人学这个真的很纠结。:)

使用特权

评论回复
15
hotpower| | 2010-11-12 00:17 | 只看该作者
晕,“纠结”这两个字很流行

使用特权

评论回复
16
kyzb001|  楼主 | 2010-11-12 08:28 | 只看该作者
恩,虽然没神马 浮云的名气大,单用的却比他们多。

使用特权

评论回复
17
kyzb001|  楼主 | 2010-11-12 13:08 | 只看该作者
自己在顶一个。

使用特权

评论回复
18
kyzb001|  楼主 | 2010-11-13 11:46 | 只看该作者
还是自己顶比较实在。 不知道有人做过了I2C的测试没。

使用特权

评论回复
19
hotpower| | 2010-11-13 20:42 | 只看该作者
本帖最后由 hotpower 于 2010-11-13 20:43 编辑

不错~~~
俺没具体看过,但俺记得回调函数是可以不区分发送和接收的,因为状态吗已经区分过了。
所以回调函数是可以收发一体化的。

CortexM0菜鸟阶段作业

Cortex-M0菜鸟之C/C++例程(第1天作业)

Cortex-M0菜鸟之C/C++例程(第2天作业)

Cortex-M0菜鸟之Keil内运行ISP(第3天作业)

CortexMo菜鸟逆向学习ISP(第4天作业)

CortexMo菜鸟之头文件搭建过程(第5天作业)

CortexM0菜鸟之红杏再现(第6天作业)

CortexM0菜鸟之IO配置(第7天作业)

CortexM0菜鸟之节拍中断(第8天作业)

CortexM0菜鸟之串口轮询(第9天作业)

CortexM0菜鸟之I2C主机中断(第10天作业)

菜农通讯工具:

新浪网页版:http://t.sina.com.cn/hotpower
新浪手机版:http://t.sina.cn/hotpower

网 易微 博:http://t.163.com/hotpower
腾讯QQ:    1270688699

菜农邮箱:     HotPower@163.com
菜农导航: http://www.hotpage.net.cn/


使用特权

评论回复
20
金鱼木鱼| | 2010-11-13 21:43 | 只看该作者
菜农的作业得好好看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

623

帖子

1

粉丝