想用AD7193,在官网上扒了段程序,但SPI收发部分需要自己编写。
- unsigned char SPI_Write(unsigned char slaveDeviceId,
- unsigned char* data,
- unsigned char bytesNumber)
- {
- // Add your code here.
- }
复制代码
这个函数第二个参数是个发送数组的指针,第三个参数是发送字节数。
该怎么处理这个指针呢?是新建个数组把原来的全部复制过来?
调用该函数的函数如下:
- void AD7193_SetRegisterValue(unsigned char registerAddress,
- unsigned long registerValue,
- unsigned char bytesNumber,
- unsigned char modifyCS)
- {
- unsigned char writeCommand[5] = {0, 0, 0, 0, 0};
- unsigned char* dataPointer = (unsigned char*)®isterValue;
- unsigned char bytesNr = bytesNumber;
-
- writeCommand[0] = AD7193_COMM_WRITE |
- AD7193_COMM_ADDR(registerAddress);
- while(bytesNr > 0)
- {
- writeCommand[bytesNr] = *dataPointer;
- dataPointer ++;
- bytesNr --;
- }
- SPI_Write(AD7193_SLAVE_ID * modifyCS, writeCommand, bytesNumber + 1);
- }
复制代码 |
完全没必要复制,你直接操作形参指针就行了,操作的长度就是形参bytesNumber。
说下你的问题至少包含:
1.调用函数中的while循环,极有可能会造成writeCommand被撑爆,应该使用writeCommand的大小作为退出的条件。
2.调用函数中SPI_Write的第一个实参这么写无效,modifyCS指针是个野指针,你必须明确的指出是哪个ID。
3.调用函数中SPI_Write的第三个实参这么写基本是内存泄漏的,除非你规定SPI_Write中第三个形参的实际数据大小要减掉1,那么这显得画蛇添足。
2.第一个参数其实是不打算用的,不过既然这个参考函数里有这个参数,所以就先保留了。要不然,参考的相关函数都要改了。
3.不明白为什么内存泄漏呢?
这个芯片通讯情况是这样的:bytesNumber是想要发送的字节数,但是在这之前需要先发给特殊的数,就是writeCommand[0]里的数,所以总共发的数是bytesNumber+1;
1.我还没想明白呢,一会再仔细琢磨下。
1.你的writeCommand的大小不是bytesNr,是sizeof(writeCommand),如果bytesNr小于sizeof(writeCommand)那么while循环还好说,但没有人会给你这个保证。你如果说我的bytesNr就是4(按照后面你的意思推算的话),那你的代码只能自己看了,过2个月自己都看不明白了。更不用说:移植、修改或更新了。
2.即使AD7193_SLAVE_ID是unsigned char类型的,你也得强制转换一下。既然不用,干脆传入NULL不就行了?!
3.可以部分参考1,你的bytesNumber必须是4,不然对于SPI_Write的第三个实参writeCommand操作来说,极有可能指针出界,导致泄漏。没人能给你保证bytesNumber必须要是4。
你这里面最大的问题在于在AD7193_SetRegisterValue申请了一段内存,你该申请多少?应该是bytesNumber,那这个数是多少?没人知道,你怎么知道是4呢?也许后天就变成了12、30、95等等。你这么写中间层的代码不但会增加出错的几率,而且极难移植、修改或更新。我给你个代码示例: