📄 main.c
字号:
*********************************************************************************************************/
void TaskWrite (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT8U ucErr = 0;
INT8U ucAck = 2;
INT8U ucWriteBuf[514];
INT16U usWriteLen = 0;
for (;;) {
OSSemPend(Write_Sem,0,&ucErr); /* 等待写信号量 */
ucErr = usbDevWritePort1(&ucAck,1,200); /* 应答PC机 */
if (ucErr == USB_NO_ERR) {
ucErr = usbDevReadPort2(&ucWriteBuf[2],
I2C_2.len,
200); /* 从PC机读取待写入数据 */
if (ucErr == USB_NO_ERR) {
usWriteLen = WriteCAT24C04 (I2C_2.offset,
&ucWriteBuf[2],
I2C_2.len); /* 向CAT24C04写入数据 */
ucWriteBuf[0] = (INT8U)(usWriteLen / 256); /* 成功写入字节数高字节 */
ucWriteBuf[1] = (INT8U)(usWriteLen % 256); /* 成功写入字节数低字节 */
usbDevWritePort1(&ucWriteBuf[0],
2,
200); /* 向PC机发送已写入字节数 */
}
}
}
}
/*********************************************************************************************************
** Function name: ReadCAT24C04
** Descriptions: 从CAT24C04中读取数据
** input parameters: usOffset CAT24C04读操作起始地址0-511
** ucRcvBuf 接收数据缓冲区指针
** usReadLen 待读取字节数1-512
** output parameters: 无
** Returned value: 读取成功:实际读取字节数
** 读取失败:0
*********************************************************************************************************/
INT16U ReadCAT24C04 (INT16U usOffset,
INT8U *ucRcvBuf,
INT16U usReadLen)
{
INT8U ucPageAddr = 0;
INT16U usHaveRcvLen = 0;
ucPageAddr = (INT8U)(usOffset&0xFF); /* 页内操作起始地址 */
if(usOffset < 256) { /* 若起始地址在第1页范围内 */
if((usOffset+usReadLen) > 256) { /* 若需要跨页操作 */
usHaveRcvLen = I2cRead (CAT24C04_FirstPage,
ucRcvBuf,
&ucPageAddr,
1,
(256-(int16)usOffset)); /* 先从第1页读取部分数据 */
ucPageAddr=0;
usHaveRcvLen += I2cRead (CAT24C04_SecondPage,
&ucRcvBuf[usHaveRcvLen],
&ucPageAddr,
1,
(int16)(usReadLen-usHaveRcvLen)); /* 再从第2页读取剩余部分数据 */
} else { /* 若操作仅在第1页内进行 */
usHaveRcvLen = I2cRead (CAT24C04_FirstPage,
ucRcvBuf,
&ucPageAddr,
1,
(int16)usReadLen); /* 从第1页读取数据 */
}
} else { /* 操作仅在第2页内进行 */
usHaveRcvLen = I2cRead (CAT24C04_SecondPage,
ucRcvBuf,
&ucPageAddr,
1,
(int16)usReadLen); /* 从第2页读取数据 */
}
return (usHaveRcvLen == usReadLen)?usHaveRcvLen:0; /* 返回操作结果 */
}
/*********************************************************************************************************
** Function name: PageWrite
** Descriptions: 以页为单位向CAT24C04写入数据
** input parameters: ucAddr 器件地址
** ucOffset 页内偏移地址0x00-0xFF
** pucWriteBuf 写入数据缓冲区指针
** usWriteLen 待写入字节数
** output parameters: 无
** Returned value: 实际写入的字节数
*********************************************************************************************************/
INT16U PageWrite (INT8U ucAddr,
INT8U ucOffset,
INT8U *pucWriteBuf,
INT16U usWriteLen)
{
INT8U i = 0;
INT8U ucPages = 0;
INT8U ucNums = 0;
INT8U ucBufTmp[PAGE_SIZE_CAT1025 + 1];
INT16U usHaveWriteLen = 0;
ucPages = (INT8U)(usWriteLen / PAGE_SIZE_CAT1025); /* 整数页 */
ucNums = (INT8U)(usWriteLen % PAGE_SIZE_CAT1025); /* 不足整数页部分 */
ucBufTmp[0] = ucOffset; /* 页内偏移地址 */
for (i = 0; i < ucPages; i++) {
memcpy(&ucBufTmp[1], pucWriteBuf, PAGE_SIZE_CAT1025); /* 将待写入数据复制到写入缓冲区*/
usHaveWriteLen += I2cWrite(ucAddr,
ucBufTmp,
PAGE_SIZE_CAT1025 + 1); /* 写入数据并累加已写入的字节数*/
usHaveWriteLen -= 1; /* 写入的有效数据字节数 */
OSTimeDly(OS_TICKS_PER_SEC / 100 + 1); /* 延时10ms */
pucWriteBuf += PAGE_SIZE_CAT1025; /* 更新缓冲区指针 */
ucBufTmp[0] += PAGE_SIZE_CAT1025;
}
if (ucNums > 0) { /* 下面写不够整数页的字节数 */
memcpy(&ucBufTmp[1], pucWriteBuf, ucNums);
usHaveWriteLen += I2cWrite (ucAddr,
ucBufTmp,
ucNums + 1); /* 写入不足一页部分数据 */
usHaveWriteLen -= 1; /* 写入的有效数据字节数 */
OSTimeDly(OS_TICKS_PER_SEC / 100 + 1); /* 延时10ms */
}
return usHaveWriteLen; /* 返回实际写入的字节数 */
}
/*********************************************************************************************************
** Function name: Write_FM24CL04
** Descriptions: 向CAT24C04中写入数据
** input parameters: usOffset CAT24C04写操作起始地址0-511
** pucWriteBuf 待写入数据缓冲区指针
** usWriteLen 待写入字节数
** output parameters: 无
** Returned value: 写入成功:实际读取字节数
** 写入失败:0
*********************************************************************************************************/
INT16U WriteCAT24C04 (INT16U usOffset,
INT8U *pucWriteBuf,
INT16U usWriteLen)
{
INT16U usHaveWriteLen = 0; /* 已写入字节数 */
if(usOffset < 256) { /* 若起始地址在第1页范围内 */
if((usOffset+usWriteLen) > 256) { /* 若需要跨页操作 */
usHaveWriteLen += PageWrite (CAT24C04_FirstPage,
usOffset,
&pucWriteBuf[0],
(256-usOffset)); /* 先向第1页写入部分数据 */
usHaveWriteLen += PageWrite (CAT24C04_SecondPage,
0,
&pucWriteBuf[usHaveWriteLen],
(usWriteLen-usHaveWriteLen)); /* 再向第2页写入剩余部分数据 */
if(usHaveWriteLen!=usWriteLen) {
return 0;
} else {
return (usHaveWriteLen); /* 返回写入的有效数据字节数 */
}
} else { /* 操作仅在第1页内进行 */
usHaveWriteLen=PageWrite (CAT24C04_FirstPage,
usOffset,
&pucWriteBuf[0],
usWriteLen); /* 写入数据 */
}
} else { /* 若在第2页内操作 */
usHaveWriteLen=PageWrite (CAT24C04_SecondPage,
usOffset,
&pucWriteBuf[0],
usWriteLen); /* 写入数据 */
}
return (usHaveWriteLen == usWriteLen)?usHaveWriteLen:0; /* 返回操作结果 */
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -