完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
使用PIC32 MX775 FF512L与C32编译主模式下的I2C,无法从奴隶读取多个字节?我在论坛上看到的问题可追溯到2010。有没有一个简单的答案来回答这个问题?
以上来自于百度翻译 以下为原文 Using PIC32MX775FF512L with C32 compiler Getting I2C in Master Mode running. Can't get it to read multiple bytes from slave? I have seen the problem on the forum dating back to 2010. Is there a easy answer to this problem Thanks |
|
相关推荐
6个回答
|
|
|
奴隶是什么?波特率是多少?时钟拉伸是否已启用?你可以读取一个字节没有问题?你看过勘误表了吗?http://WW1.Microchip .com /…EVICEDOC/800万480P.PDF
以上来自于百度翻译 以下为原文 What is the Slave? What is the Baud Rate? Is Clock Stretching Enabled? You can read one byte with no issues? Did you look at the Errata? http://ww1.microchip.com/...eviceDoc/80000480P.pdf |
|
|
|
|
|
…要点。下面的代码将正确写入(通过范围验证),并读取0x01的第一个字节,但第二个字节和所有后续的字节都是0xFF。我已经尝试了在第一个字节读取之后手动启动ACK,但是下一个PLIB函数“I2CcRebug已经完成(EEPROMIFI2CYBUS)”;“表示它尚未完成。************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************int DataSz;UTIN 32实际时钟;BoOL成功=TRUE;UTIT8 I2CBYTE1=0;UIT8 8 I2CBYTE2=0;UIT8 8 I2CBYTE3=0;UIT8 8 I2CBYTE4=0;UTIN I2CBYTE5=0;Unt8好读=0;//拔出WPAN模块退出重置TISCITBITS。TRISC14=0;PrtcBysRC14=1;/initIIDED调试消息(当支持)dBIN();/设置I2C BaDeffEffice时钟=I2CSETFEED(EEPROMETII2CYBUS,GETPUTURARALCOLCORDER()),I2CyClClOxFRIQ;如果(ABS(SturalClCK-I2CyClcLog-Frq)& gt;I2CyClcLog-Frq/10){DbPrimTf(“错误:I2C1时钟频率(%u)错误超过10% %.n”),(未签名)//(同时,ATTN=1)//启用I2C总线I2cEnabl(EEPROMYI2CL BUS,TRUE);/toto需要延迟直到ATIN线路变低,才能使I2C//********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************如果把数据写入芯片,就可以了!StartTransfer(false){{(1);} / /传输所有数据索引=0;而(成功和&;(index & lt;DATSZ)){/ /发送一个字节IF(发送字节(I2CDATA [索引)){/ /前进到下一个字节索引++;/ /验证字节是否被确认(如果)!I2cByTeWaSudio(EEPROMIFI2CYBUS){dPrPtTf(“错误:发送字节未被确认n”);成功= false;}{成功=false;}}停止传输();I2CyFrast7By位址(SLaveAdter,I2CYRCPY地址,I2CYRID);如果……StartTransfer(false){{(1);}如果(发送字节(SLaveAddio.Byter)){//验证字节是否被确认(如果)!I2cByTeAtWestRead(EEPROMIFI2CYBUS){dBPrTNF(“错误:发送字节未被确认n”);成功=false;}{成功= false;}如果(成功){if(I2CcRelvEnabl(EEPROFIXI2CYBUS,TRUE)= = I2CL接收溢出){dBPrTNF(“错误:I2C接收溢出n”);成功= false;} {而(!)I2CybDeDATAISDISABLE(EEPROMYI2CYBUS);I2cBythyI2CGETBILL(EEPROMYI2CYBUS);I2CRealEngI2CYBUS,TRUE;GooRead=I2CXECGEGHASTER(EEPROMIFI2CYBUS);}(I2CurrVelabEnabl(EEPROFIXI2CYBUS,TRUE)==I2CyEnraveOx溢出){DbPrimTf(“错误:I2C接收溢出N”)“”;成功=假;} {同时()!I2CycDeDATA可用(EEPROMYI2CYBUS);I2CBYTE1= I2CGETBYEL(EEPROMIFI2CYBUS);}(I2CcRelvEnabl(EEPROMIFI2CYBUS,TRUE)= = I2CyEnraveOx溢出){DbPrimTf(“错误:I2C接收溢出n”);成功= false;} {{同时}!I2CcRevEdDATAIS可用(EEPROMIFI2CYBUS);I2CBYTE2= I2CGETBEYEL(EEPROMIFI2CYBUS);}}StestTrimes();
以上来自于百度翻译 以下为原文 ... point taken. The below code will write correctly (verified by scope) and will read the first byte of 0x01 but second and all subsequent bytes are 0xff. I have tried manually initiating the ACK after first byte read but the next plib function "I2CAcknowledgeHasCompleted ( EEPROM_I2C_BUS );" indicates that it has not completed. // **************************************************************************** // **************************************************************************** // Application Main Entry Point // **************************************************************************** // **************************************************************************** int main(void) { UINT8 i2cData[10]; I2C_7_BIT_ADDRESS SlaveAddress; int Index; int DataSz; UINT32 actualClock; BOOL Acknowledged; BOOL Success = TRUE; UINT8 i2cbyte = 0; UINT8 i2cbyte1 = 0; UINT8 i2cbyte2 = 0; UINT8 i2cbyte3 = 0; UINT8 i2cbyte4 = 0; UINT8 i2cbyte5 = 0; UINT8 GoodRead = 0; // pull WPAN module out of reset TRISCbits.TRISC14 = 0; PORTCbits.RC14 = 1; // Initialize debug messages (when supported) DBINIT(); // Set the I2C baudrate actualClock = I2CSetFrequency(EEPROM_I2C_BUS, GetPeripheralClock(), I2C_CLOCK_FREQ); if ( abs(actualClock-I2C_CLOCK_FREQ) > I2C_CLOCK_FREQ/10 ) { DBPRINTF("Error: I2C1 clock frequency (%u) error exceeds 10%%.n", (unsigned)actualClock); } // while(ATTN == 1) // Enable the I2C bus I2CEnable(EEPROM_I2C_BUS, TRUE);// TODO NEED DELAY UNTIL ATTN LINE GOES LOW BEFORE ENABLING I2C //************************************************************************* //*********** HANDSHAKE MCP READ OF RCP STATUS AFTER POWER UP ************* //************************************************************************* I2C_FORMAT_7_BIT_ADDRESS(SlaveAddress, I2C_RCP_ADDRESS , I2C_WRITE); i2cData[0] = SlaveAddress.byte; i2cData[1] = 0x81; // Read Header Request i2cData[2] = 0x08; // 8 data bytes in Header DataSz = 3; // Start the transfer to write data to the chip if( !StartTransfer(FALSE) ) { while(1); } // Transmit all data Index = 0; while( Success && (Index < DataSz) ) { // Transmit a byte if (TransmitOneByte(i2cData[Index])) { // Advance to the next byte Index++; // Verify that the byte was acknowledged if(!I2CByteWasAcknowledged(EEPROM_I2C_BUS)) { DBPRINTF("Error: Sent byte was not acknowledgedn"); Success = FALSE; } } else { Success = FALSE; } } StopTransfer(); I2C_FORMAT_7_BIT_ADDRESS(SlaveAddress, I2C_RCP_ADDRESS , I2C_READ); //************************************************************************************* if( !StartTransfer(FALSE) ) { while(1); } if (TransmitOneByte(SlaveAddress.byte)) { // Verify that the byte was acknowledged if(!I2CByteWasAcknowledged(EEPROM_I2C_BUS)) { DBPRINTF("Error: Sent byte was not acknowledgedn"); Success = FALSE; } } else { Success = FALSE; } if(Success) { if(I2CReceiverEnable(EEPROM_I2C_BUS, TRUE) == I2C_RECEIVE_OVERFLOW) { DBPRINTF("Error: I2C Receive Overflown"); Success = FALSE; } else { while(!I2CReceivedDataIsAvailable(EEPROM_I2C_BUS)); i2cbyte = I2CGetByte(EEPROM_I2C_BUS); I2CAcknowledgeByte ( EEPROM_I2C_BUS, TRUE ); GoodRead = I2CAcknowledgeHasCompleted ( EEPROM_I2C_BUS ); } if(I2CReceiverEnable(EEPROM_I2C_BUS, TRUE) == I2C_RECEIVE_OVERFLOW) { DBPRINTF("Error: I2C Receive Overflown"); Success = FALSE; } else { while(!I2CReceivedDataIsAvailable(EEPROM_I2C_BUS)); i2cbyte1 = I2CGetByte(EEPROM_I2C_BUS); } if(I2CReceiverEnable(EEPROM_I2C_BUS, TRUE) == I2C_RECEIVE_OVERFLOW) { DBPRINTF("Error: I2C Receive Overflown"); Success = FALSE; } else { while(!I2CReceivedDataIsAvailable(EEPROM_I2C_BUS)); i2cbyte2 = I2CGetByte(EEPROM_I2C_BUS); } } StopTransfer(); |
|
|
|
|
|
MMMM不确定这一点,但是如果该函数按其名称建议“I2cByTeAtWestRead”,您不应该“检查是否确认”,而是您的问题(主)来对奴隶进行确认。对不起,我没有读过您所有的代码,所以这看起来足够好:I2CcReGeByTunt肯定Abou.另一个函数…
以上来自于百度翻译 以下为原文 No sorry I had not read through all of your code so this looks good enough: I2CAcknowledgeByte Not sure about the other function(s)... |
|
|
|
|
|
HI,确认从主机到从属的信号,当读取操作时,是需要1 I2C位传输时间完成的信号序列。在100千赫信令时,这是10微秒。因此,您必须调用:I2CcReGueHasEfter(EEPROMIFI2CYBUS);重复地,直到传输完成。该函数不会使程序挂起,它检查I2CCONYBIT.AKEN位,当操作完成时,它将被硬件清除。前面的函数是:I2CUngReQueue(EEPROMIFI2CYBUS,TRUE);是一个非阻塞函数,它只启动信号序列,不等待。要完成的操作,那么接下来的2个转移操作应该与假操作类似,最后一个。Mysil,
以上来自于百度翻译 以下为原文 Hi, Acknowledge signal from Master to Slave, when doing Read operations, is a signal sequence that need 1 I2C bit transfer time to complete. That is 10 microseconds when signaling at 100 kHz. Thus you have to call: I2CAcknowledgeHasCompleted ( EEPROM_I2C_BUS ); repeatedly, until the transfer is completed. while ( ! I2CAcknowledgeHasCompleted (EEPROM_I2C_BUS)); The function will not make the program hang, it check the I2CCON_bits.ACKEN bit, which will be cleared by hardware when the operation is completed. The preceding function: I2CAcknowledgeByte( EEPROM_I2C_BUS, TRUE ); is a non-blocking function, it just start the signal sequence, doesn't wait for the operation to complete. You should then do similar for the next 2 transfer operations, with a FALSE, for the last one. Regards, Mysil |
|
|
|
|
|
奴隶是什么?如果它是另一个PIC它需要时钟拉伸启用
以上来自于百度翻译 以下为原文 What is the Slave? If it is another PIC it needs clock stretching enabled |
|
|
|
|
|
增加的时间(!)I2CcRebug已经完成(EEPROMIFI2CYBUS)是我需要的一个成功的多字节读取函数。有许多建议可能完成了同样的事情,但这对我来说是最有意义的。谢谢你们的帮助。
以上来自于百度翻译 以下为原文 The addition of the while(!I2CAcknowledgeHasCompleted(EEPROM_I2C_BUS) was what I needed for a successful multiple byte read function. There were a number of suggestions that may have accomplished the same thing but this made the most sense to me. Thanks for the help |
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
514 浏览 0 评论
5819 浏览 9 评论
2351 浏览 8 评论
2238 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3546 浏览 3 评论
1170浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1124浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
893浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
514浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-18 04:22 , Processed in 0.845171 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1231