SPI_Clock problema

3

Estoy trabajando en un proyecto "Comunicación SPI" entre un Master PIC18f2XK22 y un sensor de píxel esclavo (sensor óptico).

Intenté escribir un dato "01010101" en el flanco ascendente, funciona, pero el nivel de SPI_CLK no es el mismo que el SPI_SDO.

¿Puede alguien ayudar, por favor?

Graciasporsurespuesta,estoycorriendounreloja2MHzyelrelojSPIesFosc/64.

Aquíestámicódigo:

voidmain(void){unsignedcharvalue;//MasterinitialisationOSCCON=0b01000000;//2Mmax2MHzTRISB=0b00000100;//SPI_SLKoupout,SPI_SDIinput,ANSELB=0b00000001;SSP2STAT=0b10000000;//SMP=1(attheend):bit7&SSP2CON1=0b00100010;//Clock=Fosc/64:bit<3:0>&CKPIPR3bits.SSP2IP=1;//MSSPinterrupthighpriorityPIR3bits.SSP2IF=0;//MSSPinterruptflagclearedPIE3bits.SSP2IE=0;//MSSPinterruptenable//LedTRISCbits.RC5=0;//setRC5tooutputSPI_CS=1;//SetCShighwhile(1){//WriteSPI_Write(inv_Product_ID);//sendtheaddressdelayms(10);//delayenms}}voidSPI_Write(unsignedchardata){SPI_CS=0;//SetCSlow//SSP2CON1=0b00100010;//risingedgeofclockSSP2BUF=data;//putthedataintheSSPBUFwhile(!SSP2STATbits.BF);//waituntiltheallbitssended}

Cambiéelreloj(OSCCON=0b00110000)a1Mhz,elrelojSPIpermaneceen(Fosc/64),aquíestáelnuevoresultado.Losdatossevenbienycuadrados,peroelrelojnoparececuadrado.

¿Algunasugerencia?

Problemaresuelto,tambiénbajéelrelojSPIusandoClock=FOSC/(4*(SSPxADD+1)

SSP2ADD=0b11111111;//SSP2CON1=0b00101010;//Reloj=FOSC/(4*(SSPxADD+1)

Yaquíestáelresultado:

Gracias a todos por su ayuda: D

    
pregunta Walid Amehri

3 respuestas

5

Tienes demasiada capacitancia en la línea del reloj o, a la inversa, el controlador del reloj es demasiado débil. Corregir uno u otro.

El reloj se ve tan mal que puede haber un condensador en la línea accidentalmente. Inspeccionar el tablero.

Si eso falla, comience a desconectar las cosas de la línea del reloj o divídalo en algunos lugares y vea qué señal se ve bien. Comience en el pin del reloj con nada conectado. Eso debería verse bien y cuadrado. Continúe agregándole más red de reloj hasta que encuentre al culpable que está cargando la línea del reloj.

    
respondido por el Olin Lathrop
5

La velocidad de giro de su señal de reloj es terrible. Esto indica que está conduciendo una carga mucho mayor de lo que el controlador está diseñado para manejar. En otras palabras, la señal del reloj no llega a los rieles de alimentación porque se está ejecutando demasiado rápido o no tiene suficiente unidad. Intente reducir la velocidad del reloj SPI hasta el punto en que la señal del reloj alcance los voltajes del riel.

Buses de pequeña escala / trabajo liviano como SPI y I2C están diseñados para viajar distancias cortas entre circuitos integrados, generalmente en la misma placa de circuito impreso. El objetivo es reducir la cantidad de pines en los circuitos integrados usando solo unos pocos pines para comunicarse.

    
respondido por el st2000
3

En uno de tus comentarios anteriores, dices:

  

Estoy ejecutando SPI Clock a 2Mhz, y tengo cable largo, pero no   Cappacitance en las líneas SPI.

¿Has pensado en la capacitancia del cable?

Digamos que está utilizando un cable con una longitud de dos metros y una capacitancia de 100pF / m. Esto significa que está cargando su reloj y líneas de datos con 200pF. Bajo 2MHz, el capacitor creado por el cable (sí, es un capacitor físico) se convierte en una resistencia con una resistencia de \ $ X_C = (2 \ pi \ cdot 2 \ cdot 10 ^ 6 \ cdot 200 \ cdot 10 ^ {- 12}) ^ {- 1} = 400 \ Omega \ $ que es bastante bajo. Además, este condensador, la resistencia (creada por el cable) más la impedancia de salida del controlador de reloj forman un filtro de paso bajo que posiblemente puede cortar parte de su señal de reloj.

Resultados:

  • Use un cable más corto
  • Disminuir frecuencia

NOTA: SPI es adecuado para comunicaciones de corto alcance (es decir, en la misma PCB).

    
respondido por el Rohat Kılıç

Lea otras preguntas en las etiquetas