Hola, gracias por la respuesta.
Resulta que leyendo me he dado cuenta que estaba implementado mal el dispositivo, el dispositivo trabaja con la comunicación de Motorola SPI, entonces lo he estado intentando implementar pero no estoy seguro de entenderlo.
1º), estoy usando un PIC16F876A, que según el datasheet dice que tiene SPI
Fragmento del datasheet:
9.3 SPI Mode
The SPI mode allows 8 bits of data to be synchronously
transmitted and received simultaneously. All four
modes of SPI are supported. To accomplish
communication, typically three pins are used:
• Serial Data Out (SDO) – RC5/SDO
• Serial Data In (SDI) – RC4/SDI/SDA
• Serial Clock (SCK) – RC3/SCK/SCL
Additionally, a fourth pin may be used when in a Slave
mode of operation:
• Slave Select (SS) – RA5/AN4/SS/C2OUT
Figure 9-1 shows the block diagram of the MSSP
module when operating in SPI mode.2º) Leo el manual del CCS C donde explica como implementarlo pero me lío un poco y no sé cómo hacerlo del todo bien
3º) el dispositivo a conectar al pic, solo emite una cadena de 16bits si la entrada SC se activa a nivel bajo durante un tiempo determinado, luego pasa el CS a modo alto, con cada golpe de reloj emitirá una cadena de 16bits, con lo cual al dispositivo lo único que le tiene que llegar el pic es esa activación del bit select.
4º) he conseguido hacer eso de una determinada manera y creo que no es la adecuada, lo explico
El código que he hecho es este:
#use SPI(STREAM=cadena,LOAD=pin_c2,DI=pin_c4,CLK=pin_c3,BITS=16)
//********************programa************************************************
void main (){
int16 captura;
setup_spi(SPI_MASTER | SPI_H_TO_L |SPI_CLK_DIV_16);
while(TRUE){
spi_xfer(cadena,j,16);
captura = spi_xfer(cadena,j,16);
}
La primer duda que tengo es en la función #USE SPI, según leo en manual dice que para implementar el hardware del pic y no hacerlo trabajar por software, hay que poner
FORCE_HW
pero si lo pongo, el compilador me da un error de :
Option invalid Not valid for H/W
que no tengo ni idea de lo que quiere decir.
La segunda: es en la construcción de la función
si pongo la función de esta manera:
setup_spi(SPI_MASTER | SPI_H_TO_L |SPI_CLK_DIV_16);
no funciona y si l apongo así:
setup_spi2(SPI_MASTER | SPI_H_TO_L |SPI_CLK_DIV_16);
si, se supone que esta es para otro SPI que tenga el chip, y creo que el 16F876A solo tiene uno, con lo cual no entiendo porque no funciona.
tercera duda:
se supone que el dispositivo es tonto, ósea que no requiere de recibir datos del pic si no con tal solo poniendo a low la entrada CS se activará y nos enviará la trama.
pues bien si en el cuerpo del main no pongo nada, el pic no genera el clok ni la señal cs pero si pongo esto:
spi_xfer(cadena,j,16);
captura = spi_xfer(cadena,j,16);
si empieza a funcionar. Según leo en el manual, esa sentencias emiten y reciben, lo que no entiendo es¿ por qué tengo que emitir si el dispositivo no va a recibir nada si no solo un pulso negativo por el CS y el reloj por el SCK?.
¿no habrá una manera de que el micro siempre emita la señal de reloj y los pulsos por CS y solo reciba la trama desde el dispositivo?
La configuración del dispositivo es la siguiente, la entrada de SCK está conectada al PIN C3
la entrada de CS está conectada al PIN C2
la salida de datos está conectada al PIN C4
como pueden ver en la cabecera hay una opción (LOAD=pin_c2) esa opción es para cada vez que se transfiera el dato se active, con eso hago los pulsos de CS, no sé si habrá otra forma mejor.
y la ultima duda no se qué diferencia hay entre
result = spi_data_is_in()
result = spi_data_is_in2()
value = spi_read (data)
value = spi_read2 (data)
spi_write (value)
spi_write2 (value)
spi_xfer(data)
spi_xfer(stream, data)
spi_xfer(stream, data, bits)
result = spi_xfer(data)
result = spi_xfer(stream, data)
result = spi_xfer(stream, data, bits)
la única que me funciona es spi_xfer las demás me da error o no funcionan, o seguro que no sé cómo ponerlas.
Bueno, esto es todo, espero que no sea muy pesada la lectura y espero haberme explicado bien.
Gracias