No entiendo CCS, lamentablemente es muy complicado para mi entender que hace la funcion spi_write() por que no tengo el codigo de spi_write(), entonces no te puedo decir que estas haciendo mal o no. Por eso mismo soy anti CCS.
Tenes que dividir tu problema. Por un lado el envio de datos. Supone que tenes que enviar 4 bytes. Y tenes que mostrar en el LCD eso.
- Entonces el SPI lo que hace es tomar esos 4 bytes guardarlos en un lugar y luego avisar con un flag o con algo diciendo que ya esta completo el dato y lo copias a otro buffer de igual tamaño. Esto por interrupciones obviamente
- En el programa principal preguntas cuando el dato esta completo, si esta completo ( es decir llegaron los 4 datos ) escribis eso en el LCD y pones en 0 el bit de dato completo.
Entonces...
La recepcion no depende del LCD para nada. lo unico que hace la recepcion es justamente recibir 4 bytes guardarlos y avisar. Si nadie lo usa entonces se terminara sobre escribiendo. SOLO y UNICAMENTE cuando reciba otros 4 bytes.
La rutina del LCD tampoco "depende" del SPI , toma el valor de un flag para saber si actualizar o no, toma el valor de una variable y lo muestra.
Si lo pensas son como 2 programas corriendo a la misma ves, uno a traves de las interrupciones y otro en el programa principal. el SPI con entradas desde el SPI hardware y salidas el flag de que se completo la transmision y el dato transmitido.
El LCD entrada, un flag indicando cuando tiene que actualizar, y un dato que no le importa de donde venga.
Si haces asi tus programas si en algun momento decidis cambiar el SPI por la UART por ejemplo, lo unico que tenes que hacer es cambiar la rutina de SPI por una de UART. respetando que al final de la rutina de UART tenga un flag y un dato como salida. Y sin necesidad de cambiar nada del programa principal (LCD).
De tal forma que si haces un programa asi por ejmeplo:
main(){
//Configuraion aca
while(1) {
dato = 0x2030; // Estos valores son fijos para prueba, pero serian asignados en el SPI, por como esta programado deberia ser igual hacer esto que si estuviera el SPI
flag = 1;
if( flag = 1 ) { LCD_Muestra(); }
}
}
Podes poner cualquier valor de "dato" o "flag" y probarlo sin necesidad de que este funcionando exactamente tu SPI. de esa forma probar el LCD que funciona correctamente.
Son los unicos consejos que te puedo dar. Y espero que me entiendas lo que intente transmitir. Entonces con eso te podes centrar en algo especifico y no pensarlo como un TODO.
--------------------
Respecto al SPI, tenes que notar que cuando el maestro envia un byte, tambien recibe un byte. Es imposible que sepas por "adelantado" lo que te va a enviar el maestro para que le respondas con lo mismo, asi que si envias 2 bytes, toda la transferencia ocuparia 3 bytes.
Paso a paso enviar 0x1234 y recibir 0x1234 del esclavo.
1- Maestro envia 0x12 y descarta lo recibido, Receptor recibe 0x12 y pone en el buffer 0x12.
2- Maestro envia 0x34 y recibe 0x12 , Receptor recibe 0x34 y pone en el buffer 0x34
3- Maestro envia cualqueir cosa ( 0x00 ) y recibe 0x34 , Receptor descarta este valor y pone en el buffer lo que le guste ya que va a ser descartado.
Creo que serian los paso a hacer.
Estas haciendolo asi ?
--------------------
2)otra cosa rara es que en el Debugger del SPI del Proteus se ven bien los valores 1 ,2 ,3 ...etc que entrega el master al esclavo,,, pero los valores del esclavo al master no son 1, 2, 3 .....etc!! pero en los Displays se ven bien !!
O el debugger esta mal, o esta mal tu programa