SPI программный. Аппаратный не дает возможности одновременного чтения - записи.
Инициализирую SPI:
Цитата
void INITSPI(void){
ebdat6_08pinConfigureToUnused(FL_PIN_41); //SCK
ebdat6_08pinConfigureToUnused(FL_PIN_42); //SS
ebdat6_08pinConfigureToUnused(FL_PIN_43); //MOSI
ebdat6_08pinConfigureToUnused(FL_PIN_44); //MISO
ebdat6_02GpioSubscribe(FL_PIN_41, FL_GPIO_OUTPUT, 1) ; //SCK
ebdat6_02GpioSubscribe(FL_PIN_42, FL_GPIO_OUTPUT, 1) ; //SS
ebdat6_02GpioSubscribe(FL_PIN_43, FL_GPIO_OUTPUT, 1) ; //MOSI
ebdat6_02GpioSubscribe(FL_PIN_44, FL_GPIO_INPUT, 1) ; //MISO
}
ebdat6_08pinConfigureToUnused(FL_PIN_41); //SCK
ebdat6_08pinConfigureToUnused(FL_PIN_42); //SS
ebdat6_08pinConfigureToUnused(FL_PIN_43); //MOSI
ebdat6_08pinConfigureToUnused(FL_PIN_44); //MISO
ebdat6_02GpioSubscribe(FL_PIN_41, FL_GPIO_OUTPUT, 1) ; //SCK
ebdat6_02GpioSubscribe(FL_PIN_42, FL_GPIO_OUTPUT, 1) ; //SS
ebdat6_02GpioSubscribe(FL_PIN_43, FL_GPIO_OUTPUT, 1) ; //MOSI
ebdat6_02GpioSubscribe(FL_PIN_44, FL_GPIO_INPUT, 1) ; //MISO
}
Прием / запись SPI. На основе найденного на этом форуме кода:
Цитата
u8 SEND_READ_BYTE(u8 bt)//Data is always output from the device on the falling edge of the clock MCP3208
{u8 a,dats=0;
bool mBits;
for(a=0;a<8;a++)
{
if(bt&0x80)while(ebdat6_04WriteGpio(FL_PIN_43,1)!=FL_OK); //Если передаваемый бит = 1
else while(ebdat6_04WriteGpio(FL_PIN_43,0)!=FL_OK); //Если передаваемый бит = 0
while(ebdat6_04WriteGpio(FL_PIN_41, 0)!=FL_OK);
dats<<=1; //Буфер приема
bt<<=1; //Байт для передачи
while(ebdat6_05ReadGpio(FL_PIN_44,&mBits)!=FL_OK); //Читаем состояние вывода в mBits из MISO
if(mBits)dats|=1; //Если mBits = 1, пишем 1
while(ebdat6_04WriteGpio(FL_PIN_41, 1)!=FL_OK);
}
return dats;
}
{u8 a,dats=0;
bool mBits;
for(a=0;a<8;a++)
{
if(bt&0x80)while(ebdat6_04WriteGpio(FL_PIN_43,1)!=FL_OK); //Если передаваемый бит = 1
else while(ebdat6_04WriteGpio(FL_PIN_43,0)!=FL_OK); //Если передаваемый бит = 0
while(ebdat6_04WriteGpio(FL_PIN_41, 0)!=FL_OK);
dats<<=1; //Буфер приема
bt<<=1; //Байт для передачи
while(ebdat6_05ReadGpio(FL_PIN_44,&mBits)!=FL_OK); //Читаем состояние вывода в mBits из MISO
if(mBits)dats|=1; //Если mBits = 1, пишем 1
while(ebdat6_04WriteGpio(FL_PIN_41, 1)!=FL_OK);
}
return dats;
}
Чтение АЦП, преобразование во float:
Цитата
float ADCRead (char Channel) { //Чтение АЦП и преобразование во float
#define F 4.075/4095 //Множитель для преобразования во float
float FR;
unsigned int adc; //
unsigned char ADCL, ADCH; //
Channel = Channel & 0x7; //Номер канала - младшие 3 бита.
Channel = Channel <<2; //
while(ebdat6_04WriteGpio(FL_PIN_42,0)!=FL_OK);//Сбросить CS в 0
ADCL = SEND_READ_BYTE(0x60|Channel); //Стартовый бит(7), дифф. бит(6), биты номера канала(5,4,3)
ADCH = SEND_READ_BYTE(0x0); //В ADCH помещаются биты 11-4
ADCL = SEND_READ_BYTE(0x0); //В ADCL помещаются биты 3-0 в старший ниббл!
while(ebdat6_04WriteGpio(FL_PIN_42,1)!=FL_OK);//Установить CS в 1
ADCL = ADCL & 0Xf0; //Нужная информация в старшем ниббле
adc = ((ADCL)|((ADCH)<<8)); //Преобразование в INT
adc = (adc >>4); //Выравнивание по правому краю
FR= (((float)adc)*F); //Преобразование во Float
return FR;} //Возвращаем Float.
#define F 4.075/4095 //Множитель для преобразования во float
float FR;
unsigned int adc; //
unsigned char ADCL, ADCH; //
Channel = Channel & 0x7; //Номер канала - младшие 3 бита.
Channel = Channel <<2; //
while(ebdat6_04WriteGpio(FL_PIN_42,0)!=FL_OK);//Сбросить CS в 0
ADCL = SEND_READ_BYTE(0x60|Channel); //Стартовый бит(7), дифф. бит(6), биты номера канала(5,4,3)
ADCH = SEND_READ_BYTE(0x0); //В ADCH помещаются биты 11-4
ADCL = SEND_READ_BYTE(0x0); //В ADCL помещаются биты 3-0 в старший ниббл!
while(ebdat6_04WriteGpio(FL_PIN_42,1)!=FL_OK);//Установить CS в 1
ADCL = ADCL & 0Xf0; //Нужная информация в старшем ниббле
adc = ((ADCL)|((ADCH)<<8)); //Преобразование в INT
adc = (adc >>4); //Выравнивание по правому краю
FR= (((float)adc)*F); //Преобразование во Float
return FR;} //Возвращаем Float.
И наконец - тест восмиканального АЦП:
Цитата
void TestADC (void) {
char buf[20];
float FR;
unsigned char i;
unsigned char j;
for(j=0; j<8; j++)
{FR=ADCRead(j);
i=sprintf(buf, "%d %f\r\n",j, FR);
ebdat9_02SendToSerialPort(buf, i);}
}
char buf[20];
float FR;
unsigned char i;
unsigned char j;
for(j=0; j<8; j++)
{FR=ADCRead(j);
i=sprintf(buf, "%d %f\r\n",j, FR);
ebdat9_02SendToSerialPort(buf, i);}
}