This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

我想用CC2640板子模拟I2C来读取寄存器数据,为啥到发送开始信号(SDA_OUT)那就卡住了,代码如下所示:

Other Parts Discussed in Thread: CC2640

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

/* XDCtools Header files */
#include <xdc/std.h>
#include <xdc/runtime/System.h>

/* BIOS Header files */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Clock.h>
#include <ti/sysbios/knl/Task.h>

/* TI-RTOS Header files */
#include <ti/drivers/PIN.h>
#include <ti/drivers/I2C.h>//modify
#include <ti/drivers/i2c/I2CCC26XX.h>

#include <ti/drivers/GPIO.h>

/* Board Header files */
#include "Board.h"
   
#include "I2Ctest.h"
#define RX6110
#define  SCL_PIN    Board_I2C_SCL
#define  SDA_PIN    Board_I2C_SDA
 
#define SCL_PIN_HIGHT  GPIO_write(SCL_PIN,1)
#define SCL_PIN_LOW    GPIO_write(SCL_PIN,0)
 
 
#define SDA_OUT (GPIO_setConfig(SDA_PIN, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW))
#define SDA_IN  (GPIO_setConfig(SDA_PIN, GPIO_CFG_INPUT))
 
#define SDA_PIN_HIGHT  GPIO_write(SDA_PIN,1)
#define SDA_PIN_LOW    GPIO_write(SDA_PIN,0)
#define SDA_PIN_READ   GPIO_read(SDA_PIN)


/* Pin driver handle */
static PIN_Handle ledPinHandle;
static PIN_State ledPinState;
#define TASKSTACKSIZE     1024
static Task_Struct task0Struct;
static Char task0Stack[TASKSTACKSIZE];




void IIC_PIN_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
void Write_IIC_Byte(unsigned char IIC_Byte);
void Write_Add(uint8_t add,uint8_t wdata,uint8_t comd);
uint8_t Read_Add(uint8_t add,uint8_t comd);
bool IIC_WaitAck(void);
void IIC_NOAck(void);

static I2C_Handle      handle;
static I2C_Params      params;
static I2C_Transaction i2cTrans;
    
void delay_ms(uint32_t i)
{
    while(i--)
    {
        int j=1000;
        while(j--);
    }
}

void IIC_Start(void)
{
   SDA_OUT;
   SDA_PIN_HIGHT;
   SCL_PIN_HIGHT;
  // SDA_PIN_HIGHT;
   SDA_OUT;
   SDA_PIN_LOW; 
   SCL_PIN_LOW;
}
 
/**********************************************
//IIC Stop
停止条件:当SCL为高电平时,SDA由低电平向高电平的转�?
**********************************************/
void IIC_Stop(void)
{
   SDA_OUT;
   SDA_PIN_LOW;
   SCL_PIN_HIGHT;
   SDA_OUT;
   SDA_PIN_HIGHT;
   SCL_PIN_LOW;
}
 
 
 
void Write_IIC_Byte(unsigned char IIC_Byte)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        if(IIC_Byte & 0x80)
        {
            SDA_OUT;
            SDA_PIN_HIGHT;
        }
 
        else
        {
            SDA_OUT;
            SDA_PIN_LOW;
        }
 
        SCL_PIN_HIGHT;
        SCL_PIN_LOW;
        IIC_Byte<<=1;
    }
    SDA_OUT;
    SDA_PIN_HIGHT;
    SCL_PIN_HIGHT;
    SCL_PIN_LOW;
 
 
}
 
uint8_t Read_IIC_Byte(void)
{
    uint8_t rdata=0,i=0;
    SCL_PIN_LOW;
    SDA_IN;
    for(i=0;i<8;i++)
    {
        SCL_PIN_HIGHT;
        rdata= (rdata << 1) | SDA_PIN_READ;
        SCL_PIN_LOW;
    }
    return rdata;
}
 
bool IIC_WaitAck(void)
{
    SCL_PIN_LOW;
    SDA_OUT;
    SDA_PIN_HIGHT;
    SCL_PIN_HIGHT;
 
    SDA_IN;
    if(SDA_PIN_READ)
    {
        SCL_PIN_LOW;
        return false;
    }
    else
    {
        SCL_PIN_LOW;
        return true;
    }
 
}
 
void IIC_NOAck(void)
{
    SCL_PIN_LOW;
    SDA_OUT;
    SDA_PIN_HIGHT;
    SCL_PIN_HIGHT;
    SCL_PIN_LOW;
 
}
 
void IIC_Ack(void)
{
    SCL_PIN_LOW;
    SDA_OUT;
    SDA_PIN_LOW;
    SCL_PIN_HIGHT;
    SCL_PIN_LOW;
}
void Write_Add(uint8_t add,uint8_t comd,uint8_t wdata)
{
    IIC_Start(); //����һ����ʼ�ź�
    Write_IIC_Byte(add);
    Write_IIC_Byte(comd);
    Write_IIC_Byte(wdata);
    IIC_Stop();  //����һ����ֹ�ź�
}
 
uint8_t Read_Add(uint8_t add,uint8_t comd)
{
    uint8_t tdata;        //�ȴ���Ӧ
    IIC_Start();     //�ٲ���һ����ʼ�ź�
    Write_IIC_Byte(add);
    Write_IIC_Byte(comd);
    IIC_Start();     //�ٲ���һ����ʼ�ź�
    Write_IIC_Byte(add+1);
    tdata = Read_IIC_Byte();
    IIC_NOAck();
    IIC_Stop();      //����һ����ֹ�ź�
    return tdata;
}

static uint8_t bbb(UArg arg0, UArg arg1)
{
    /* Create I2C for usage *****************/
       I2C_Params_init(&params);
       params.bitRate = I2C_100kHz;
       //params.transferMode = I2C_MODE_BLOCKING;//I2C_MODE_CALLBACK;

       handle = I2C_open(Board_I2C, &params);
       if (handle == NULL) {
           System_abort("Error Initializing I2C\n");
       }
       else {
           System_printf("I2C Initialized!\n");
       }
     /* Complete I2C creating for usage**********/
     Task_sleep(1000000 / Clock_tickPeriod);
     
     Write_Add(0x64,0x17,0xa8);
      return 0;
}


/*
 *  ======== main =================================================================================================
 */
int rx6110main1(void)
{
    Task_Params taskParams;

    /* Call board init functions */
    Board_initGeneral();
    Board_initI2C();
    /* Construct g_sensor Task  thread */
    Task_Params_init(&taskParams);
    taskParams.stackSize = TASKSTACKSIZE;
    taskParams.stack = &task0Stack;
    Task_construct(&task0Struct, (Task_FuncPtr)bbb, &taskParams, NULL);

    /* Start BIOS */
    BIOS_start();

    return (0);
}

  • 核心代码如下:(I2C打开和初始化都是ok的)

    #define  SCL_PIN    Board_I2C_SCL

    #define  SDA_PIN    Board_I2C_SDA

    #define SCL_PIN_HIGHT  GPIO_write(SCL_PIN,1)

    #define SCL_PIN_LOW    GPIO_write(SCL_PIN,0)

    #define SDA_OUT (GPIO_setConfig(SDA_PIN, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW))

    #define SDA_IN  (GPIO_setConfig(SDA_PIN, GPIO_CFG_INPUT))

    #define SDA_PIN_HIGHT  GPIO_write(SDA_PIN,1)

    #define SDA_PIN_LOW    GPIO_write(SDA_PIN,0)

    #define SDA_PIN_READ   GPIO_read(SDA_PIN)

    void IIC_Start(void)

    {

      SDA_OUT;

      SDA_PIN_HIGHT;

      SCL_PIN_HIGHT;

     // SDA_PIN_HIGHT;

      SDA_OUT;

      SDA_PIN_LOW;

      SCL_PIN_LOW;

    }

    void Write_Add(uint8_t add,uint8_t comd,uint8_t wdata)

    {

       IIC_Start(); //产生一个起始信号

       Write_IIC_Byte(add);

       Write_IIC_Byte(comd);

       Write_IIC_Byte(wdata);

       IIC_Stop();  //产生一个终止信号

    }

    Write_Add(0x64,0x17,0xa8);

  • 在CC2640上模拟IIC没有试过,测下SDA是否有信号输出