Usando las bibliotecas I²C del software C18, ¿hay alguna forma inteligente de establecer la velocidad del bus?

Después de encontrar problemas con el hardware I²C como se describe aquí , decidí probar el software I²C usando las funciones de biblioteca del compilador MPLAB C18. Afortunadamente, las bibliotecas generan una señal atractiva en los pines, pero estoy un poco preocupado por los tiempos que utilizan.

La documentación y los archivos fuente del compilador C18 no dicen explícitamente para qué velocidad de bus y frecuencia del oscilador se establecen los retrasos en las funciones, por lo que me pregunto si hay una mejor manera de ajustarlos que sumergirse en los archivos fuente y calcular a mano el número de retrasos que necesito.

No me acercaría a las bibliotecas C18 IIC. No sé qué tipo de compensaciones eligieron para mí. IIC es demasiado simple para arriesgarse con algunas bibliotecas enlatadas. Incluso si lo hace, para cuando verifique que realmente hacen lo que quieren y comprendan exactamente cómo, podría haberlo escrito usted mismo. Vaya a embedinc.com/pic/dload.htm e instale las versiones de PIC Development Tools y PIC 18F USB Framework. Mi módulo IIC de firmware genérico del firmware U1EX estará en SOURCE > USB, llamado U1EX_IIC.ASPIC. Es fácil de personalizar y puedes ver exactamente lo que está pasando.
@Olin Lathrop Gracias por el enlace. Parece interesante.
@OlinLathrop, ¿a qué tipo de compensaciones te refieres? Supongo que mi falta general de una comprensión profunda de I2C me hizo optar por la biblioteca C18 I2C, y seguro que parece funcionar bien para mi EEPROM serial. Pero ahora tengo que echar un vistazo a su lib para ver qué tipo de personalización es posible. :)
@Dave: si no entiende IIC, entonces esto es lo primero que debe corregir antes de intentar usarlo. A diferencia de los sistemas grandes con una capa de sistema operativo y muchas llamadas a la biblioteca, no tiene por qué usar algo que no entiende en los sistemas pequeños. Al final, pasará más tiempo tratando de que las bibliotecas enlatadas hagan lo que quiere hacer, persiguiendo errores que no tienen sentido, o incluso encontrando fallas de campo más tarde, todo porque se perdió un detalle importante que se salió con la suya. en la pequeña cantidad de prototipos con sus casos de uso limitados.
@OlinLathrop, ¿se refiere específicamente a casos en los que uno está diseñando un dispositivo I2C? Si es así, entonces estaría de acuerdo. Pero si solo está usando una parte OTS que usa direccionamiento de 7 bits y admite las dos velocidades típicas (100kHz y 400kHz), ¿por qué es tan malo usar la biblioteca C18?
@Dave: Tal vez lo hicieron bien para el caso que le interesa, pero para cuando lo verifique, podría haber escrito el código usted mismo y entonces sabrá exactamente lo que está haciendo. Además, en estos pequeños sistemas es una mala idea usar capas a ciegas sin comprender lo que sucede debajo.

Respuestas (2)

Por lo general, lo que haré es crear una macro que defina la frecuencia de reloj de mi sistema.

#define GetSytemClock() (41666667ul)

Luego cree una macro usando la fórmula en la hoja de datos para calcular la velocidad del reloj.

#define GetSSPBRG(i2c_clk) (((GetSystemClock()/i2c_clk)/4)-1)

Pase la frecuencia de reloj i2c (Hz) que desee a la macro GetSSPBRG() y le proporcionará el valor correcto para el registro SSPxADD.

Inicializar la comunicación requiere verificar todas sus suposiciones. . . Compruebe la integridad de la señal en ambos extremos utilizando dos sondas AB en modo diferencial. Utilice perlas o núcleos de ferrita en modo de comunicación para asegurarse de que ningún ruido de CM perdido se convierta en una señal diferencial. Asegúrese de que la impedancia termine correctamente y que los niveles sean buenos. . ¿El reloj en RTC está sintonizado con mayúsculas? y configurado correctamente? ¿Permitió un reinicio lo suficientemente largo para que el reloj se iniciara? ¿Está funcionando a la velocidad correcta? Verifique ambos extremos y elija algunos patrones de prueba como U = 55h = 01010101 3 = 33h = 00110011 verifique con alcance que está enviando bien.

Luego envíe el comando de llamada general 00h.

Luego pide pizza.

En realidad, esta respuesta no es muy relevante para la pregunta, ya que supone que en realidad hay un funcionamiento correcto I 2 C autobús que necesita solución de problemas. El problema es que sin configuración, la frecuencia del reloj, en mi caso, es de 125 kHz y necesito configurarla en 100 kHz. Algunas fuentes dicen que debería usar el registro SPADD incluso en modo software para establecer la frecuencia del reloj, pero no tuve tiempo suficiente para confirmarlo.