我的代码在下面,请教各位大侠,有两个问题
1、CDCE193在I2C配置haishi中当从机,请问从机地址应该写0xC8,还是写0x65
2、我配置I2C的顺序不知道有没有问题,还请大神指教
int main(void)
{
ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480), 120000000);
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C4); // 使能I2C4
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOR); // 使能R口
GPIOPinConfigure(GPIO_PR6_I2C4SCL); // 初始化GPIO口作为I2C
GPIOPinConfigure(GPIO_PR7_I2C4SDA);
GPIOPinTypeI2CSCL(GPIO_PORTR_BASE, GPIO_PIN_6);
GPIOPinTypeI2C(GPIO_PORTR_BASE,GPIO_PIN_7);
I2CMasterInitExpClk(I2C4_BASE, ui32SysClock, false); // 100K传输
I2CMasterEnable(I2C4_BASE);
I2CMasterSlaveAddrSet(I2C4_BASE, CDCE913_ADDRESS_Write, false); // 913为从机
// 以下是写寄存器过程
for(ui32Index = 0; ui32Index < NUM_I2C_DATA; ui32Index++)
{
I2CMasterControl( I2C4_BASE, I2C_MASTER_CMD_BURST_SEND_START ); //start
I2CMasterControl(I2C4_BASE,I2C_MASTER_CMD_SINGLE_SEND); // 单字节传送配置
while( I2CMasterErr(I2C6_BASE) | I2CMasterBusy(I2C6_BASE) );
I2CMasterDataPut(I2C4_BASE, CDCE913inx_data[ui32Index*2]); // 寄存器地址
while( I2CMasterErr(I2C6_BASE) | I2CMasterBusy(I2C6_BASE) );
I2CMasterDataPut(I2C4_BASE, CDCE913inx_data[ui32Index*2+1]); // 寄存器写入值
while( I2CMasterErr(I2C6_BASE) | I2CMasterBusy(I2C6_BASE) );
//I2CMasterControl( I2C6_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH ); //stop
// while(I2CMasterBusy(I2C4_BASE)); // 等待传完
}
return(0);
}
Maka Luo:
M4是作为主还是从,从程序来看你应该是主。
如果是,那从机地址就是看从设备地址是多少了?
Jacky Xu:
看你从设备数据手册规定的地址是多少?一般I2C协议的话因为最低位是作为读写位,所以有些按照描述方式不同会有需要左移一位的情况,具体还是要看手册。
Engineer:
回复 Jacky Xu:
是的,CDCE913是从机。
根据手册CDCE913芯片地址,应该为0xC8(其中最低位为0,代表写),想请同时懂I2C和CDCE913的大侠帮忙看下
在TI 给的I2C例程基础上修改如下配置CDCE913芯片,假如我现在向913芯片的0x02寄存器写入0x61,并读该寄存器,判读写入是否正确
问题:
1、CDCE913的写寄存器和读寄存器 的I2C写法是否正确,实在不知道哪里有问题,就是调不通;
2、读回来的时候,CDCE913_ADDRESS 地址应该写7位的还是8位的呢? pui32DataRx[0] = I2CSlaveDataGet( CDCE913_ADDRESS );
// 以下是写寄存器过程
I2CMasterSlaveAddrSet(I2C4_BASE, CDCE913_ADDRESS_Write, false); // 913为从机 I2CMasterDataPut(I2C4_BASE,0x82 ); // command指令 (最高位已经置1,代表单字节读写) I2CMasterControl( I2C4_BASE, I2C_MASTER_CMD_SINGLE_SEND ); //start while( I2CMasterBusy(I2C4_BASE) ); // 等待回应
I2CMasterControl( I2C4_BASE, I2C_MASTER_CMD_SINGLE_SEND ); //start I2CMasterDataPut(I2C4_BASE,0x61 ); // 寄存器写入值 while( I2CMasterBusy(I2C4_BASE) ); // 等待回应
// 以下是读寄存器过程// 先写要读的寄存器地址 I2CMasterSlaveAddrSet(I2C4_BASE, CDCE913_ADDRESS_Write, false); // 913为从机 I2CMasterDataPut(I2C4_BASE, 0x82); // command指令 (最高位已经置1,代表单字节读写) I2CMasterControl( I2C4_BASE, I2C_MASTER_CMD_SINGLE_SEND ); //单字节传送 start while( I2CMasterBusy(I2C4_BASE) ); // 等待回应// 可以开始回读了 I2CMasterSlaveAddrSet( I2C4_BASE, CDCE913_ADDRESS_Read, true); //控制传输方向为主机读取 I2CMasterControl( I2C4_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE ); // 开始接收 while(I2CMasterBusy(I2C4_BASE) ); pui32DataRx[0] = I2CSlaveDataGet( CDCE913_ADDRESS ); while(I2CMasterBusy(I2C4_BASE) );