请教F28M35 I2C 调试

2019-08-02 16:11发布

有谁用过F28M35?
我在用61IC的I2C 例程来调试TI的Concerto_F28M35xx_control_CARD,我手上也有61IC的开发板,因为没有仿真器目前,所以只能调试TI的了。
TI的板子用的是PB6 PB7, 61IC用的是PB2 PB3。
我把例程中相应的改为PB6 PB7,并且,GPIOPINUNLOCK了PB7。
但是结果始终不对,READDATA始终和WRITEDATA不对。
不知道问题出在哪,没有很多时间从DATASHEET慢慢的找问题。

希望高手能指点。

谢谢。

下面是我的代码:
#include "inc/hw_i2c.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/debug.h"

#define ID_I2C_ADDR                0x50

static tBoolean
WriteData(unsigned char ucAddr, unsigned char ucData);
static tBoolean
ReadData(unsigned char *pucData, unsigned long ulOffset,
                 unsigned long ulCount);
int main(void)
{
    unsigned char pucData[8]={'a','b','c','d','e','f','g','h'};
    unsigned char dat[8];
    unsigned char i;
    unsigned char value1, value2, value3, value4;
    // Disable Protection
    HWREG(SYSCTL_MWRALLOW) =  0xA5A5A5A5;

    // Setup main clock tree for 75MHz - M3 and 150MHz - C28x
    SysCtlClockConfigSet(SYSCTL_SYSDIV_1 | SYSCTL_M3SSDIV_2 | SYSCTL_USE_PLL |
                         (SYSCTL_SPLLIMULT_M & 0x0F));


    SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);                        /*  使能I2C外设                 */
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);                       /*  使能GPIO外设                */
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);

    // Disable clock supply for the watchdog modules
    SysCtlPeripheralDisable(SYSCTL_PERIPH_WDOG1);
    SysCtlPeripheralDisable(SYSCTL_PERIPH_WDOG0);

    IntMasterEnable();                                                  /*  使能处理器中断              */

    GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_6);
    GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_7);


    GPIOPinUnlock(GPIO_PORTB_BASE, GPIO_PIN_7);
    //GPIOPinUnlock(GPIO_PORTB_BASE, GPIO_PIN_6);

    //GPIOPinConfigure(GPIO_PB2_I2C0SCL);
    //GPIOPinConfigure(GPIO_PB3_I2C0SDA);
    GPIOPinConfigure(GPIO_PB7_I2C0SCL);
    GPIOPinConfigure(GPIO_PB6_I2C0SDA);

    //GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3);
    GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_6 | GPIO_PIN_7);

    GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_6, ~0);
    GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_7, ~0);

    I2CMasterInitExpClk(I2C0_MASTER_BASE, SysCtlClockGet(
                            SYSTEM_CLOCK_SPEED), false);

   // for(i=0;i<8;i++)
   //         WriteData(0x08+i,pucData[i]);
    ReadData(dat,0x08,8);
    value1=dat[0];
    value2=dat[1];
    value3=dat[2];
    value4=dat[3];
    for(i=0;i<8;i++)
    {
            if(dat[i]!=pucData[i])
            {
                    GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_6, 0);
                    while(1);
            }
    }
    GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_7, 0);
    while(1);
}

void Delays (unsigned char no)
{
        int i, j;
        for ( ; no > 0; no--) {
                for (i = 0; i < 150; i++) {
                    for (j = 0; j < 255; j++);
                }
        }
}

static tBoolean
WaitI2CFinished(void)
{
    //
    // Wait until the current byte has been transferred.
    //
    while(I2CMasterIntStatus(I2C0_MASTER_BASE, false) == 0)
    {
    }

    if(I2CMasterErr(I2C0_MASTER_BASE) != I2C_MASTER_ERR_NONE)
    {
        I2CMasterIntClear(I2C0_MASTER_BASE);
        return(false);
    }

    //
    // Clear any interrupts set.
    //
    while(I2CMasterIntStatus(I2C0_MASTER_BASE, false))
    {
        I2CMasterIntClear(I2C0_MASTER_BASE);
    }

    return(true);
}

static tBoolean ReadData(unsigned char *pucData, unsigned long ulOffset,unsigned long ulCount)
{
    unsigned long ulToRead;
    I2CMasterIntClear(I2C0_MASTER_BASE);
    I2CMasterSlaveAddrSet(I2C0_MASTER_BASE, ID_I2C_ADDR, false);
    I2CMasterDataPut(I2C0_MASTER_BASE, ulOffset);
    I2CMasterControl(I2C0_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_START);
    if(!WaitI2CFinished())
        return(false);
    I2CMasterSlaveAddrSet(I2C0_MASTER_BASE, ID_I2C_ADDR, true);
    I2CMasterControl(I2C0_MASTER_BASE,
                     ((ulCount > 1) ? I2C_MASTER_CMD_BURST_RECEIVE_START :
                     I2C_MASTER_CMD_SINGLE_RECEIVE));
    ulToRead = ulCount;

    while(ulToRead)
    {
        while(I2CMasterIntStatus(I2C0_MASTER_BASE, false) == 0) { }
        I2CMasterIntClear(I2C0_MASTER_BASE);
        *pucData++ = I2CMasterDataGet(I2C0_MASTER_BASE);
        ulToRead--;
        if(ulToRead)
            I2CMasterControl(I2C0_MASTER_BASE,
                             ((ulToRead == 1) ?
                              I2C_MASTER_CMD_BURST_RECEIVE_FINISH :
                              I2C_MASTER_CMD_BURST_RECEIVE_CONT));
    }
    return(true);
}


static tBoolean WriteData(unsigned char ucAddr, unsigned char ucData)
{
    I2CMasterIntClear(I2C0_MASTER_BASE);
    I2CMasterSlaveAddrSet(I2C0_MASTER_BASE, ID_I2C_ADDR, false);
    I2CMasterDataPut(I2C0_MASTER_BASE, ucAddr);
    I2CMasterControl(I2C0_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_START);
    if(!WaitI2CFinished())
        return(false);
    I2CMasterDataPut(I2C0_MASTER_BASE, ucData);
    I2CMasterControl(I2C0_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
    if(!WaitI2CFinished())
        return(false);
//    SysCtlDelay(SysCtlClockGet()/600 );
    Delays(15);
    return(true);
}

/*********************************************************************************************************
END FILE
*********************************************************************************************************/
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
zhangmangui
1楼-- · 2019-08-02 18:50
这个没用过  帮忙顶啦
demoxie
2楼-- · 2019-08-02 22:37
谢谢,怎么就没有高手帮忙指点一下啊。
下面是测试的时候注销掉的,正常时没有注销的。
for(i=0;i<8;i++)
         WriteData(0x08+i,pucData[i]);
houjiakai
3楼-- · 2019-08-03 03:56
找版主的
wangdezhi
4楼-- · 2019-08-03 08:51
这么复杂呢

一周热门 更多>