Estoy intentando configurar el módulo MSSP de un PIC18F25K22 en el modo maestro SPI. Estoy mirando el tiempo y el reloj no se mantiene estable durante toda la transmisión. Una imagen lo muestra mejor que las palabras.
Despuésdeenviarunbit,elrelojseacorta,ynoenlamismacantidadcadavez.NohetrabajadoconSPIantes,perolosdiagramasqueheencontradoenWikipediayotrosrecursosnuncamuestranesto.TambiénconectéunArduinoynoviestecomportamiento.Micódigoes:
#pragmaconfigFOSC=INTIO67//OscillatorSelectionbits(Internaloscillatorblock)#pragmaconfigPLLCFG=OFF//4XPLLEnable(Oscillatoruseddirectly)#pragmaconfigBOREN=OFF//Brown-outResetEnablebits(Brown-outResetdisabledinhardwareandsoftware)#pragmaconfigWDTEN=OFF//WatchdogTimerEnablebits(Watchdogtimerisalwaysdisabled.SWDTENhasnoeffect.)#pragmaconfigMCLRE=EXTMCLR//MCLRPinEnablebit(MCLRpinenabled,RE3inputpindisabled)#pragmaconfigLVP=OFF//Single-SupplyICSPEnablebit(Single-SupplyICSPdisabled)#pragmaconfigXINST=OFF//ExtendedInstructionSetEnablebit(InstructionsetextensionandIndexedAddressingmodedisabled(Legacymode))voidmain(void){OSCCON=0b11100110;spi_setup();__delay_ms(10);bytetemp;while(TRUE){temp=spi_transfer(0x00);temp=spi_transfer(0x01);temp=spi_transfer(0x02);temp=spi_transfer(0x03);temp=spi_transfer(0x04);temp=spi_transfer(0x05);__delay_us(1);}}voidspi_setup(void){SSP1STAT=0b00000000;SSP1STATbits.CKE=HIGH;//datatransmittedonrisingedgeSSP1CON1=0b00000000;//enableMasterSPImodeSSP1CON1bits.CKP1=LOW;//clockidlestateislow//i2cbits,alldon'tmattersforSPI,clearedjustincaseSSP1CON3=0;//baudrategenerationSSP1ADD=0;//FCLOCK=8Mhz/2=2Mhz//configurepinsforoutput/inputasneededSDI1=INPUT;SDO1=OUTPUT;SCK1=OUTPUT;SS1=OUTPUT;SSP1CON1bits.SSPEN1=HIGH;//enablepinsforserialmode}unsignedcharspi_transfer(unsignedchardata){SS1_LAT=LOW;//selectslavePIR1bits.SSPIF=LOW;SSP1BUF=data;//while(!SSP1STATbits.BF);//waitforreceivetocompletewhile(!PIR1bits.SSPIF);SS1_LAT=HIGH;//deselectslavePIR1bits.SSPIF=LOW;//clearinterruptreturnSSP1BUF;//returndatafromtheslave}
(también
¿Alguien ha encontrado esto o tiene sugerencias sobre la causa?
Lo que hice
Al final, no pude hacer funcionar el módulo MSSP1. Sin embargo, cambiarlo al módulo MSSP2, exactamente el mismo código, no presentó este comportamiento. No puedo explicarlo, pero esto resolvió el problema.