DSP

C6748_I2C

2019-07-13 19:14发布

此程序实现C6748的IIC模块对IICEEPROM设备的数据读写功能,地址是0x50(高7位)。程序先写入并读出一个字节数据,然后写入并读出一页数据,接着对比写入和读出的数据,根据结果判断IICEEPROM设备读写是否成功,主函数如下: intmain(void) { int i,result; unsignedchar buf_send[8]; unsignedchar buf_recv[8]; //I2C管脚配置 I2CPinMuxSetup(0); // 初始化串口终端使用串口2 UARTStdioInit(); // 打印串口终端信息 UARTPuts("Tronlong IIC EEPROM Application...... ", -1); // 中断初始化 InterruptInit(); IICInterruptInit(); // IIC初始化 IICInit(); // 写一个字节 UARTPuts("Write single byte to address 0x0, value is 0x55. ", -1); EEPROMByteWrite(0x0, 0x55); // 等待写完成 EEPROMAckPolling(); // 读一个字节 memset(buf_recv,0,8); buf_recv[0] = EEPROMRandomRead(0); UARTPuts("Read one byte at a address 0x0, the value is ", -1); UARTPutHexNum(buf_recv[0]); UARTPuts(". ", -1); // 读取当前地址值 buf_recv[1] = EEPROMCurrentAddressRead(); UARTPuts("Read one byte at current address 0x0, the value is ", -1); UARTPutHexNum(buf_recv[1]); UARTPuts(". ", -1); for(i=0;i<8;i++) { if(i%2 ==0) buf_send[i]=0xaa; else buf_send[i]=0x55; } // 连续写指定长度(一个页面) UARTPuts("Write one page (8 bytes) to address 0x0. ", -1); EEPROMPageWrite(0x00,buf_send,8); // 等待写完成 EEPROMAckPolling(); memset(buf_recv,0,8); // 连续读指定长度(一个页面) UARTPuts("Read one page (8 bytes) at address 0x0. ", -1); EEPROMSequentialRead(0x00,buf_recv,8); result = 1; for (i=0;i<8;i++) { if (buf_send[i]!=buf_recv[i]) { result = 0; break; } } // 如果 result 等于 1 ,说明写入的字节值与读出的字节值全部相同。否则,写入与读取的不一致 if (result) UARTPuts("Verify successfully. ", -1); else UARTPuts("Verify failed. ", -1); for(;;) { } }

I2CPinMuxSetup(0);函数对C6748IIC0模块所在复用引脚的功能配置为IIC引脚。设置SYSCFG0模块的PINMUX4寄存器的PINMUX4_15_12PINMUX4_11_8字段都为2,则设置了引脚功能为I2C0_SDAI2C0_SCL (手册P22 (指南P204 (指南P226 函数如下: voidI2CPinMuxSetup(unsignedint instanceNum) { unsignedint savePinMux = 0; if(0 == instanceNum) { savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) & ~(SYSCFG_PINMUX4_PINMUX4_15_12 | SYSCFG_PINMUX4_PINMUX4_11_8); HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) = (PINMUX4_I2C0_SDA_ENABLE | PINMUX4_I2C0_SCL_ENABLE | savePinMux); } elseif(1 == instanceNum) { savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) & ~(SYSCFG_PINMUX4_PINMUX4_23_20 | SYSCFG_PINMUX4_PINMUX4_19_16); HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) = (PINMUX4_I2C1_SDA_ENABLE | PINMUX4_I2C1_SCL_ENABLE | savePinMux); } else { } }

主函数配置了I2C管脚后,就调用UARTStdioInit();函数初始化串口终端,使用串口2UARTStdioInit函数做的事主要是对PSC1Power and Sleep Controller)进行设置,使能UART2模块,然后设置UART2模块所在复用引脚的功能为TXRX,并设置UART2的串口参数为8数据位,1停止位,无校验位,UART模式为FIFO模式,然后使能UARTfree运行模式,启动UART2,详细细节可参考这篇博文: http://blog.csdn.net/zengaliang/article/details/78348051 启动UART2之后,串口2就可以进行收发了。先是打印串口终端信息,UARTPuts("Tronlong IIC EEPROM Application...... ", -1);UARTPuts函数判断要发送的字符是否已经是空字符,如果不是,则调用UARTPutc函数将字符写到UART的transmitter FIFO,如果是,就退出。UARTPuts函数如下: unsignedintUARTPuts(char *pTxBuffer, int numBytesToWrite) { unsignedint count = 0; unsignedint flag = 0; if(numBytesToWrite < 0) { flag = 1; } while('