此程序实现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);函数对C6748的IIC0模块所在复用引脚的功能配置为IIC引脚。设置SYSCFG0模块的PINMUX4寄存器的PINMUX4_15_12和PINMUX4_11_8字段都为2,则设置了引脚功能为I2C0_SDA和I2C0_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();函数初始化串口终端,使用串口2。UARTStdioInit函数做的事主要是对PSC1(Power
and Sleep Controller)进行设置,使能UART2模块,然后设置UART2模块所在复用引脚的功能为TX和RX,并设置UART2的串口参数为8数据位,1停止位,无校验位,UART模式为FIFO模式,然后使能UART的free运行模式,启动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('