Так значит вот код:
//Адреса регистров ADC
#define COMMUNICATIONS_R 0x00//Communications register
#define STATUS_R 0x00//Status register
#define MODE_R 0x01//Mode register
#define ADC_CONTROL_R 0x02//ADC cotrol register (ADCCON)
#define FILTER_R 0x03//Filter register
#define DATA_R 0x04//ADC data register
#define OFFSET_R 0x05//ADC offset register
#define GAIN_R 0x06//ADC gain register
#define IO_CONTROL_R 0x07//I/O control register
#define TEST1_R 0x0C//TEST1 register
#define TEST2_R 0x0D//TEST2 register
#define ID_R 0x0F//ID register
//Биты соответствующих регистров
#define READ 0x40//бит чтения в Communications register
#define WRITE 0x00//бит записи в Communications register
#define RDY 7//7 бит регистра status
//Биты в Mode register
#define CHOP_ON 0x00//выше скорость, но меньше частота
#define CHOP_OFF 0x80//ниже скорость, но больше частота
#define NEGBUF_ON 0x40//buffered
#define NEGBUF_OFF 0x00//unbuffered
#define REFSEL_ON 0x20//Select REFIN2(+),REFIN2(-)
#define REFSEl_OFF 0x00//Select REFIN1(+),REFIN1(-)
#define CHCON_ON 0x10//10-channel configuretion
#define CHCON_OFF 0x00//8-channel configuretion
#define OSCPD_ON 0x08//oscillator shut off
#define OSCPD_OFF 0x00//oscillator not shut off
#define POWER_DOWN_MODE 0x00
#define IDLE_MODE 0x01
#define SINGLE_CONVERSION_MODE 0x02
#define CONTINUOUS_CONVERSION_MODE 0x03
#define SYSTEM_ZERO_SCALE_CALIBRATION 0x06
#define SYSTEB_FULL_SCALE_CALIBRATION 0x07
sbit CSbitADC=P0^3;//нога отвечающая за активизацию (выбор) АЦП
#define SELECT_ADC() CSbitADC=0;//CS enable
#define DESELECT_ADC() CSbitADC=1;//CS disable
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef enum { FALSE = 0, TRUE } BOOL;
//установка нужного бита в регисре
#define SET_BIT(reg_,bit_) ((reg_)|=1‹‹(bit_))
//очистка нужного бита в регистре
#define CLEAR_BIT(reg_,bit_) ((reg_)&=~1‹‹(bit_))
//установлен ли в регистре проверяемый бит в 1
#define IS_SET(reg_,bit_) ((reg_)&1‹‹(bit_))
//Функция обмена байтами между контроллером и АЦП по SPI
//Вход: one_char - передаваемый символ
//Выход: принимаемый символ
BYTE ExchangeBySPI(const BYTE one_char)
{
SPI0DAT=one_char;
while(!SPIF);
SPIF=0;
return (BYTE)SPI0DAT;
}
//Функция чтения регистра АЦП
//Вход: name_reg - имя регистра АЦП
//Выход: значение прочитанного регистра
BYTE ReadRegADC(BYTE name_reg)
{
SELECT_ADC();//Чип селект
ExchangeBySPI(name_reg | READ);//выбор регистра для работы
name_reg=ExchangeBySPI(0xFF);//чтение данных из регистра
DESELECT_ADC();//И деселект чипа
return (name_reg);
}
//Функция записи в регистр АЦП нужного значения
//Вход: name_reg - имя регистра АЦП
// data_reg - записываемое значение
void WriteRegADC(BYTE name_reg,const BYTE data_reg)
{
SELECT_ADC();//Чип селект
ExchangeBySPI(name_reg | WRITE);//выбор регистра для работы
ExchangeBySPI(data_reg);//запись данных в регистр
DESELECT_ADC();//И деселект чипа
}
//Функция инициализации одного канала АЦП
//Вход: value_ADCCON - значение записываемое в регистр ADCCON
// value_MODER - значение записываемое в регистр MODE
//Выход: TRUE - инициализация прошла успешно
// FALSE - ошибка инициализации
BOOL InitOneChannelADC(BYTE value_ADCCON,BYTE value_MODER)
{
BYTE time=255;//тайм аут
WriteRegADC(ADC_CONTROL_R,value_ADCCON);//конфигурируем ADCCON
WriteRegADC(MODE_R,(value_MODER|0x56));//конфигурируем MODE
//pause(64000);
do
if ((ReadRegADC(MODE_R)&0x07)==1)//MD bits 001?
{
time=255;
WriteRegADC(MODE_R,(value_MODER|0x57));
do
if ((ReadRegADC(MODE_R)&0x07)==1)//MD bits 001?
return TRUE;
while (time--);
return FALSE;
}
while (time--);
return FALSE;
}
//Функция инициализации микросхемы АЦП
//Выход: TRUE - инициализация прошла успешно
// FALSE - ошибка инициализации
BOOL InitADC()
{
WriteRegADC(IO_CONTROL_R,0x00);//конфигурируем IOCON
WriteRegADC(FILTER_R,0x45);//конфигурируем FILTER
if (InitOneChannelADC(0x2F,0x56))//инициализируем 3й канал
return TRUE;
return FALSE;
}
//Функция чтения данных с одного канала АЦП
//Вход: number_channel - номер канала АЦП
// *data_ - указатель на данные
//Выход: TRUE - чтение данных прошло успешно
// FALSE - ошибка чтения данных
BOOL ReadDataChannel(BYTE number_channel,WORD *data_)
{
BYTE time=255;//тайм аут
WriteRegADC(MODE_R,0x52);
WriteRegADC(ADC_CONTROL_R,(((number_channel-1)&0x03)‹‹4)| 0x0F);
do
if (!(IS_SET(ReadRegADC(STATUS_R),RDY)))
{
SELECT_ADC();
ExchangeBySPI(DATA_R | READ);
*data_=ExchangeBySPI(0xFF);
*data_=((*data_)‹‹
| (ExchangeBySPI(0xFF));
DESELECT_ADC();
return TRUE;
}
while (time--);
}
void main()
{
BOOL test_ADC;
test_ADC=InitADC();
while(1)
{
test_ADC=ReadDataChannel(3,&dataADC);
}
}
Вобщем на всё это дело я получаю инициализацию через раз, походу микросхема не всегда срабатыввает, мейби сначала ресет дёрнуть, перед тем как проинициализировать??? ну а счтением данных вообще беда, одни FF. то что SPI сам работет эт проверено осцилографом, да и микросхма то инициализируется, помогите плиз)