📄 cmx865ads.c
字号:
/*_____________________________________________________________________________________________________________________________________________________________________________
cmx865(Tipo, Direccion, Dato)
Version 1.0 Julio 12 2008
Transmite y lee datos a y desde el CMX865ADS
Parametros:
Tipo- tipo de trama q se envia y que se espera
0- Comando
1- Direccion y dato 8 bits
2- Direccion y un datos de 16 bits
3- Direccion y un dato de 8 bits de regreso
4- Direccion y un dato de 16 bits de regreso
Direccion- 8 bits
Dato- hasta 16 bits
Ubiquos Ltda. Alexander Espinosa G.
_____________________________________________________________________________________________________________________________________________________________________________*/
unsigned int cmx865(unsigned char Tipo, unsigned char Direccion, unsigned int Dato)
{
unsigned char Cta_bits;
unsigned int Respuesta;
// Generar las secuencias de pulsos necesarias para el envio del primer bloque de 8 bits (comando/direccion)
// el CMX recibe bits en cada flanco de subida del clock
HABILITAR_CMX(); // Seleccionar el chip
retardo_cmx865(2000);
Cta_bits=0;
do
{
CLRCLK_CMX(); // Asegura el clock en bajo antes de enviar datos
retardo_cmx865(5000);
if(Direccion & 0x80) // verificar el bit mas significativo
{
SETDATA_CMX(); // Si se trata de un 1, envia un alto al cmx
}
else
{
CLRDATA_CMX(); // de lo contrario envia un 0
}
SETCLK_CMX(); // este flanco latcha los datos en el cmx
retardo_cmx865(5000);
Direccion<<=1; // Escoger el proximo bit
}
while(++Cta_bits<8); // 8 bits para direccion/comando
if(Tipo==0) return 0; // si solo es un comando, regresa sin resultado
// Decodificar el tipo de trama
switch(Tipo)
{
case 1: // Direccion y dato de 8 bits
Cta_bits=8;
Dato<<=8; // Ubicar el byte en la parte alta para facilitar el envio
break;
case 2: // Direccion y dato de 16 bits
Cta_bits=16;
break;
case 3: // Direccion y dato de 8 bits de retorno
Cta_bits=8; Dato=0; // en este caso no importa el valor enviado
break;
case 4: // Direccion y dato de 16 bits de retorno
Cta_bits=16;Dato=0; // en este caso no importa el valor enviado
break;
}
// A continuacion enviar el campo de datos y recibir la respuesta simultaneamente, la respuesta es valida en el clk alto
Respuesta=0;
do
{
CLRCLK_CMX(); // Asegura el clock en bajo antes de enviar datos
retardo_cmx865(5000);
if(Dato & 0x8000) // verificar el bit mas significativo
{
SETDATA_CMX(); // Si se trata de un 1, envia un alto al cmx
}
else
{
CLRDATA_CMX(); // de lo contrario envia un 0
}
SETCLK_CMX(); // este flanco latcha los datos en el cmx
retardo_cmx865(5000);
Respuesta&=0xFFFE; // por defecto asume bit entrante como 0
if(DATAIN_STAT_CMX()) // si entra un bit en alto
{
Respuesta|=0x0001; // lo carga en la respuesta
}
Respuesta<<=1; // rota el bit recien llegado
Dato<<=1; // Escoger el proximo bit a transmitir
}
while(--Cta_bits); // contar el bit de turno
retardo_cmx865(5000);
INHABILITAR_CMX();
Respuesta>>=1;
return Respuesta;
}
void retardo_cmx865(unsigned int Retardo)
{
while(--Retardo);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -