|
ad7730, не могу прочитать.. |
|
|
|
Apr 15 2009, 05:42
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
Здравствуйте. кто нибудь сталкивался с такой проблемой...при попытки прочитать регистры состояния ad7730 +AT91sam7s256 . выдает на все запросы-- 0xFFFF. Осцилографом проверял , данные приходят на АЦП-на выходе. проскакивают импульсы, очень похоже на нагрузке как емкостни. (эспоненциалные). длина соединительных поводов 20 см. частота тактирования 500 кГц.питание АЦП 5в(и аналоговой и цифровой части). микроконтроллера 3.3 В. сигнал CS снимал так и МК так и на землю вешал. POL- вешал и на землю и на питание -тоже самое.
|
|
|
|
|
Apr 15 2009, 08:27
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
сейчас я запитал цифровую часть 3.3 вольта. аналоговая 5в. прочитать ни чего не могу. на запрос чтерия любого lрегистра, выдает одно и тоже(FFFF). может там на уровне железа?? подтягивать сигнальные линии резисторами по питанию нужно?
|
|
|
|
|
Apr 15 2009, 11:49
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
да. сооотвествует. пробывал пример алгоритма предложенного в даташите..тот же результат.
кварц на одной ноге постоянка ( MCLK IN) . на второй есть генерация (MCLK OUT). так должно быть??
|
|
|
|
|
Apr 15 2009, 12:32
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
reset "1"-заведен на +питания. cs-сначало вешал на сооотвествующую ногу контроллера.потом посадил на землю.
SYNC- тоже на питании сидит..
такое ощущения что я неправильно организую посылку команды чтения-записи. там ведь идет так. команда (допустим 0x11. чтение данных) потом пустой (0xff) так?? или по другому?
|
|
|
|
|
Apr 16 2009, 05:43
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
провод вешал на землю и на питание-выдавало (0х00 и 0xFF) .работает значит spi контроллера. пускал данные по кольцу. замыкал вых данные и входные на контроллере.все в порядке идут нормально. земли соедены. на выходе ad7730 присутствует лог "1" . думаю..может микрушка не работает?
|
|
|
|
|
Apr 17 2009, 05:40
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
постоянная присутсвует, и иногда дергается.точно не разбереш импульсы есть или нет-осцилограф старый. если по выходу контроллера проще (зациклил вывод данных) и смотри . по входу сложнее гораздо. точно не могу определить. насчет команды...делал так . write_spi ( 0x11) команда чтения. регистра данных , затем любой другой байт .write_spi( 0xFFFF).
разводка на макетке.
|
|
|
|
|
Apr 17 2009, 11:52
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
подключил другое ацп с spi...тоже самое. значит ошибки в настройке контроллера. данные по кругу гоняет.но в внешнию железку не загоняет.
|
|
|
|
|
Apr 23 2009, 07:09
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
опять подскажите. контроллер настроил, spi работает. микросхему ad7730 новую поставил. в результате при опросе всех читаемых регистров, выдает 0х00, 0xeb. и прочее. код как бы меняется. но по цикличном опросе. значения "сдвигаются"-по регистарамм. предпологаю что неправильно задаю команды.. алгоритмично делаю так cs=0; write_spi(cod); write_spi(0x00); write_spi(0x00); read_spi; read_spi; cs=1; вроде ни чего сложного, но не работает. когда меняю длину поссылки на 8 или 16 бит---все значения выдает по нулям--это видно и на осцилографе. можете посоветовать что нибудь??
|
|
|
|
|
Apr 23 2009, 07:42
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
сейчас кидаю коды чтения регистров, из даташита( 0x10....0x17). а как на аппаратном spi-счиатывать одновременно? din-можно удерживать посылая (0xff)??
|
|
|
|
|
Apr 23 2009, 08:45
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
так тоже не получается....что-то идет. а что нинаю. ..просьба. можете дать кусочек кода для работы с ad7730, как пример. в инете мало что нашел
|
|
|
|
|
Apr 23 2009, 11:47
|

Гуру
     
Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287

|
Цитата(shuric80 @ Apr 23 2009, 09:42)  сейчас кидаю коды чтения регистров, из даташита( 0x10....0x17). а как на аппаратном spi-счиатывать одновременно? din-можно удерживать посылая (0xff)?? Очень просто - буфер-то кольцевой. Действительно, нужно посылать единицы. Цитата(shuric80 @ Apr 23 2009, 10:45)  так тоже не получается....что-то идет. а что нинаю. ..просьба. можете дать кусочек кода для работы с ad7730, как пример. в инете мало что нашел С ad7730 не работал, а для AD7738 (принцип, думаю, тот же) делал примерно так: CODE /*--------------функция обмена байтом по SPI----------------*/ unsigned char WriteSPI(unsigned char ByteToSend) { unsigned char TempVariable; BF = 0; TempVariable = SSPBUF; // Reads from SSPBUF, ensures BF bit is clear before SSPBUF = ByteToSend; // sending the next byte. while(!BF); // Wait until the transmission is complete. return SSPBUF; // The data received should be valid. }
/*----------функция сброса внешнего АЦП-----------------*/ void Reset7738 (void) { CSA=0; // выбор кристалла для внешнего АЦП DelayUs(2); WriteSPI(0); // WriteSPI(0xFF); // WriteSPI(0xFF); // WriteSPI(0xFF); // WriteSPI(0xFF); // CSA=1; // отключить внешний АЦП DelayMs(1); }
/*-------функция записи байта в регистр AD7738----------*/ /* (ADREG - адрес регистра, DATA - данные) */
void WR_to_ADC (ADREG, DATA) unsigned char ADREG, DATA; { CSA=0; // выбор кристалла для внешнего АЦП DelayUs(2); WriteSPI(ADREG); // WriteSPI(DATA); // CSA=1; // отключить внешний АЦП DelayMs(1); }
/*-----функция чтения выбранного регистра AD7738-------*/ /* (ADREG - адрес регистра, ln - длина данных в байтах)*/
unsigned int READ_ADC (ADREG, ln) unsigned char ADREG, ln; { unsigned int BUFDAT; // 16-bit data buffer CSA=0; // выбор кристалла для внешнего АЦП DelayUs(2); BUFDAT=0; // очистить буфер WriteSPI(ADREG+0x40); // установить бит чтения BUFDAT=WriteSPI(0); // читать при низком DIN первый байт if (ln==2) // если данные 16-разрядные { BUFDAT=BUFDAT<<8; // сдвинуть байт в старший BUFDAT=BUFDAT+WriteSPI(0); // и дописать в буфер младший байт } CSA=1; // отключить внешний АЦП DelayUs(2); return BUFDAT; }
Сообщение отредактировал Herz - Apr 23 2009, 11:50
|
|
|
|
|
Apr 23 2009, 12:48
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
не очень уверен. я сигнал cs-от ноги отдельно вывел. и программно щелкаю. сам spi завел на другое ацп для теста-там работало нормально.
|
|
|
|
|
Apr 23 2009, 13:07
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
попала из запасов mcp3204 (простенькая ацп с спи) подключил.понастраивал.заработало. разобрался с настройками spi на контроллере. были сомнения по его работе.
|
|
|
|
|
Apr 23 2009, 14:17
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
Herz, большое спсибо за пример. завтра попробую на основе вашего написать.
|
|
|
|
|
Apr 24 2009, 11:08
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
не работает. выдает код какой то один и тот же. как будто 2 знака последних в буфере выходном засели и выдает их. замкнул ноги ацп между собой-а считываемые данные не изменились.
|
|
|
|
|
Apr 24 2009, 13:40
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
частота тактовых импульсов spi сейчас стоит 1 МГц. фронты не завалены. сейчас попробую паузы понаставить.
|
|
|
|
|
Apr 27 2009, 05:21
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
SPI аппаратный. Сигнал-СS отдельно дергаю. а какую частоту выставить? пробовал 500 кГц. тоже самое.
|
|
|
|
|
Apr 28 2009, 07:36
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 14-04-09
Пользователь №: 47 671

|
по даташиту чтобы просмотреть содержимое регистра данных нужно послать его адрес 0x12- . ??? выдает данные. повторяющиеся. вроде буффер выходной на АЦП или на spi -неочищается и выдает одно и тоже..
|
|
|
|
|
Apr 29 2009, 12:54
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Для начала: для обращения к регистрам у меня написан такой файл (не нашел как сюда загрузить файл, поэтому втыкаю его в текст): CODE // // Чтение/запись по SPI // .global ReadStatus ReadStatus: ldi r18, 0x10 out 0x0f, r18 sbis 0x0e, 7 rjmp .-4 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r24, 0x0f ret // Data .global ReadData ReadData: ldi r18, 0x11 out 0x0f, r18 sbis 0x0e, 7 rjmp .-4 /* mov r25, r1 // 3 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r24, 0x0f // 2 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r23, 0x0f // 1 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r22, 0x0f // 0 */ out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r25, 0x0f // 2 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r24, 0x0f // 1 subi r25, 0x80 ret // Mode .global ReadMode, WriteMode ReadMode: ldi r18, 0x12 out 0x0f, r18 sbis 0x0e, 7 rjmp .-4 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r25, 0x0f out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r24, 0x0f ret WriteMode: ldi r18, 0x02 out 0x0f, r18 sbis 0x0e, 7 rjmp .-4 out 0x0f, r25 sbis 0x0e, 7 rjmp .-4 out 0x0f, r24 sbis 0x0e, 7 rjmp .-4 ret // Filter .global ReadFilter, WriteFilter ReadFilter: ldi r18, 0x13 out 0x0f, r18 sbis 0x0e, 7 rjmp .-4 mov r25, r1 // 3 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r24, 0x0f // 2 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r23, 0x0f // 1 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r22, 0x0f // 0 ret WriteFilter:ldi r18, 0x03 out 0x0f, r18 sbis 0x0e, 7 rjmp .-4 out 0x0f, r24 sbis 0x0e, 7 rjmp .-4 out 0x0f, r23 sbis 0x0e, 7 rjmp .-4 out 0x0f, r22 sbis 0x0e, 7 rjmp .-4 ret // DAC .global ReadDAC, WriteDAC ReadDAC: ldi r18, 0x14 out 0x0f, r18 sbis 0x0e, 7 rjmp .-4 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r24, 0x0f // 2 ret WriteDAC: ldi r18, 0x04 out 0x0f, r18 sbis 0x0e, 7 rjmp .-4 out 0x0f, r24 sbis 0x0e, 7 rjmp .-4 ret // Offset .global ReadOffset, WriteOffset ReadOffset: ldi r18, 0x15 out 0x0f, r18 sbis 0x0e, 7 rjmp .-4 mov r25, r1 // 3 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r24, 0x0f // 2 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r23, 0x0f // 1 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r22, 0x0f // 0 ret WriteOffset:ldi r18, 0x05 out 0x0f, r18 sbis 0x0e, 7 rjmp .-4 out 0x0f, r24 sbis 0x0e, 7 rjmp .-4 out 0x0f, r23 sbis 0x0e, 7 rjmp .-4 out 0x0f, r22 sbis 0x0e, 7 rjmp .-4 ret // Gain .global ReadGain, WriteGain ReadGain: ldi r18, 0x16 out 0x0f, r18 sbis 0x0e, 7 rjmp .-4 mov r25, r1 // 3 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r24, 0x0f // 2 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r23, 0x0f // 1 out 0x0f, r1 sbis 0x0e, 7 rjmp .-4 in r22, 0x0f // 0 ret WriteGain: ldi r18, 0x06 out 0x0f, r18 sbis 0x0e, 7 rjmp .-4 out 0x0f, r24 sbis 0x0e, 7 rjmp .-4 out 0x0f, r23 sbis 0x0e, 7 rjmp .-4 out 0x0f, r22 sbis 0x0e, 7 rjmp .-4 ret[/code] Прототипы в h-файле: [code]// AdcComm.h uint8_t ReadStatus(); #define NOREF 0x10 // No reference voltage #define STBY 0x20 // Standby mode #define STDY 0x40 // Steady #define RDY 0x80 // Ready ///////////////////////////////////////////////////////////////////////////// //long ReadData(); int ReadData(); ///////////////////////////////////////////////////////////////////////////// int ReadMode(); void WriteMode(int); #define BO 0x0004 // BurnoutCurrent #define CLKDIS 0x0008 // Master clock disable #define RANGE10 0x0000 // Input range #define RANGE20 0x0010 #define RANGE40 0x0020 #define RANGE80 0x0030 #define HIREF 0x0080 // High reference (5V) #define WL 0x0100 // Word length (1-24 bit) #define DO 9 // Digital output bits position #define DEN 0x0800 // Digital output enable #define UNI 0x1000 // 1 - unipolar #define MD_IDLE 0x0000 // Idle mode #define MD_CC 0x2000 // Continuous conversion #define MD_SC 0x4000 // Single conversion #define MD_STBY 0x6000 // Standby #define MD_IC0 0x8000 // Internal zero-scale calibration #define MD_ICF 0xa000 // Internal full-scale calibration #define MD_SC0 0xc000 // System zero-scale calibration #define MD_SCF 0xe000 // System full-scale calibration ///////////////////////////////////////////////////////////////////////////// long ReadFilter(); void WriteFilter(long); #define CHOP 0x000010 // Chop enable #define AC 0x000020 // AC excitation #define FAST 0x000100 // FASTStep mode #define SKIP 0x000200 // FIR filter skip ///////////////////////////////////////////////////////////////////////////// uint8_t ReadDAC(); void WriteDAC(uint8_t); long ReadOffset(); void WriteOffset(long); long ReadGain(); void WriteGain(long); Схема примерно такая:
CS у меня постоянно выбран, SPI программируется так: SPCR = _BV(SPE) | _BV(MSTR) | 0x0; Дальнейшая работа такая: WriteFilter((1791L<<12)|CHOP|AC|15); // 57 Гц (1791), CHOP, AC, задержка 15 WriteDAC(ReadEE(DAC_EE)); WriteOffset(ReadEE4(OFFSET_EE)); WriteGain(ReadEE4(GAIN_EE)); WriteMode(MD_CC|REF|BO|Range); // запуск АЦП ReadEE - это считывание калибровок и прочей фигни из EEPROM После этого в прерывании считываются значения путем обращения ReadData()
|
|
|
|
|
Jul 2 2014, 07:18
|
Группа: Новичок
Сообщений: 1
Регистрация: 30-06-14
Пользователь №: 82 107

|
Всем привет, я пишу на mikro C for AVR. Не использую SPI интерфейс. Помогите разобрать правильный ли код и в чём моя ошибка: CODE #include <built_in.h> //AD7730 sbit RESET_Port_7730 at PortC2_Bit; // 0 - active, 1 - deactive sbit RESET_OPREDEL_7730 at DDC2_Bit; sbit CS_Port_7730 at PortC3_bit; sbit CS_OPREDEL_7730 at DDC3_bit; sbit RDY_Port_7730 at PortC4_bit; volatile sbit RDY_Pin_7730 at PinC4_bit; sbit RDY_OPREDEL_7730 at DDC4_bit; sbit DOUT_Port_7730 at PortC5_bit; sbit DOUT_Pin_7730 at PinC5_bit; sbit DOUT_OPREDEL_7730 at DDC5_bit; sbit DIN_Port_7730 at PortC6_bit; sbit DIN_OPREDEL_7730 at DDC6_bit; sbit SCLK_Port_7730 at PortC7_bit; sbit SCLK_OPREDEL_7730 at DDC7_bit; bit RP_7730_0; bit RP_7730_1; bit RP_7730_2; bit RP_7730_3; bit RP_7730_4; bit RP_7730_5; bit RP_7730_6; bit RP_7730_7; bit RP_7730_8; bit RP_7730_9; bit RP_7730_10; bit RP_7730_11; bit RP_7730_12; bit RP_7730_13; bit RP_7730_14; bit RP_7730_15; bit RP_7730_16; bit RP_7730_17; bit RP_7730_18; bit RP_7730_19; bit RP_7730_20; bit RP_7730_21; bit RP_7730_22; bit RP_7730_23; unsigned long Cod7730 = 0; unsigned long Cod7730TX[11]; // #define SCLK_ON 1 #define SCLK_OFF 0 void Initial() { DDRA = 0b00000000; PORTA = 0b11111111; DDRB = 0b00000000; PORTB = 0b11111111; DDRC = 0b00000000; PORTC = 0b11111111; DDRD = 0b00000000; PORTD = 0b11111101; delay_ms(100); RESET_Port_7730=0; // ACTIVE RESET RESET_OPREDEL_7730=1; CS_Port_7730=1; CS_OPREDEL_7730=1; RDY_Port_7730=1; RDY_OPREDEL_7730=0; DOUT_Port_7730=1; DOUT_OPREDEL_7730=0; DIN_Port_7730=1; DIN_OPREDEL_7730=1; SCLK_Port_7730=SCLK_OFF; SCLK_OPREDEL_7730=1; } Delay_WriteStart() { delay_us(4); } Delay_WriteStop() { delay_us(2); } Delay_ReadStart() { delay_us(4); } Delay_ReadStop() { delay_us(2); } void WriteAD7730(char count)////////////////////////////////////////////////////////////// { CS_Port_7730=0; delay_us(11); DIN_Port_7730 = RP_7730_0; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_1; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_2; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_3; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_4; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_5; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_6; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_7; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); if(count==16 || count==24) { DIN_Port_7730 = RP_7730_8; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_9; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_10; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_11; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_12; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_13; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_14; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_15; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); } if(count==24) { DIN_Port_7730 = RP_7730_16; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_17; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_18; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_19; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_20; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_21; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_22; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); DIN_Port_7730 = RP_7730_23; SCLK_Port_7730 = SCLK_ON; Delay_WriteStart(); SCLK_Port_7730 = SCLK_OFF; Delay_WriteStop(); } delay_us(16); CS_Port_7730=1; DIN_Port_7730 = 1; }/////////////////////////////////////////////////////////////////////////////// void ReadAD7730()/////////////////////////////////////////////////////////////// { char yu = 1; char TextADCA = 0; char TextADCB = 0; char TextADCD = 0; Cod7730 = 0; while (RDY_Pin_7730==1) { } Delay_us(5); CS_Port_7730=0; delay_us(4); SCLK_Port_7730 = SCLK_ON; Delay_us(6); TextADCD = DOUT_Pin_7730; Delay_us(6); SCLK_Port_7730 = SCLK_OFF; Delay_us(12); for (yu = 1; yu <= 7; yu++) { SCLK_Port_7730 = SCLK_ON; Delay_us(6); TextADCD = (TextADCD << 1) + DOUT_Pin_7730; Delay_us(6); SCLK_Port_7730 = SCLK_OFF; Delay_us(12); } SCLK_Port_7730 = SCLK_ON; Delay_us(6); TextADCB = DOUT_Pin_7730; Delay_us(6); SCLK_Port_7730 = SCLK_OFF; Delay_us(12); for (yu = 1; yu <= 7; yu++) { SCLK_Port_7730 = SCLK_ON; Delay_us(6); TextADCB = (TextADCB << 1) + DOUT_Pin_7730; Delay_us(6); SCLK_Port_7730 = SCLK_OFF; Delay_us(12); } SCLK_Port_7730 = SCLK_ON; Delay_us(6); TextADCA = DOUT_Pin_7730; Delay_us(6); SCLK_Port_7730 = SCLK_OFF; Delay_us(12); for (yu = 1; yu <= 7; yu++) { SCLK_Port_7730 = SCLK_ON; Delay_us(6); TextADCA = (TextADCA << 1) + DOUT_Pin_7730; Delay_us(6); SCLK_Port_7730 = SCLK_OFF; Delay_us(12); } delay_us(8); CS_Port_7730=1; Higher(Cod7730) = TextADCD; Hi(Cod7730) = TextADCB; Lo(Cod7730) = TextADCA; }/////////////////////////////////////////////////////////////////////////////// void main() { Initial(); delay_ms(100); RESET_Port_7730=1; // Cancel RESET delay_ms(100); while(1) { // FILTER RP_7730_0=0; RP_7730_1=0; RP_7730_2=0; RP_7730_3=0; RP_7730_4=0; RP_7730_5=0; RP_7730_6=1; RP_7730_7=1; WriteAD7730(8); RP_7730_0=1; RP_7730_1=0; RP_7730_2=0; RP_7730_3=0; RP_7730_4=0; RP_7730_5=0; RP_7730_6=0; RP_7730_7=0; RP_7730_8=0; RP_7730_9=0; RP_7730_10=0; RP_7730_11=0; RP_7730_12=0; RP_7730_13=0; RP_7730_14=0; RP_7730_15=0; RP_7730_16=0; RP_7730_17=0; RP_7730_18=0; RP_7730_19=1; RP_7730_20=0; RP_7730_21=0; RP_7730_22=0; RP_7730_23=0; WriteAD7730(24); // DAC RP_7730_0=0; RP_7730_1=0; RP_7730_2=0; RP_7730_3=0; RP_7730_4=0; RP_7730_5=1; RP_7730_6=0; RP_7730_7=0; WriteAD7730(8); RP_7730_0=0; RP_7730_1=0; RP_7730_2=1; RP_7730_3=0; RP_7730_4=0; RP_7730_5=0; RP_7730_6=1; RP_7730_7=1; WriteAD7730(8); // MODE RP_7730_0=0; RP_7730_1=0; RP_7730_2=0; RP_7730_3=0; RP_7730_4=0; RP_7730_5=0; RP_7730_6=1; RP_7730_7=0; WriteAD7730(8); RP_7730_0=1; RP_7730_1=0; RP_7730_2=1; RP_7730_3=1; RP_7730_4=0; RP_7730_5=0; RP_7730_6=0; RP_7730_7=1; RP_7730_8=1; RP_7730_9=0; RP_7730_10=0; RP_7730_11=0; RP_7730_12=1; RP_7730_13=0; RP_7730_14=0; RP_7730_15=0; WriteAD7730(16); while (RDY_Pin_7730==1) { } // MODE RP_7730_0=0; RP_7730_1=0; RP_7730_2=0; RP_7730_3=0; RP_7730_4=0; RP_7730_5=0; RP_7730_6=1; RP_7730_7=0; WriteAD7730(8); RP_7730_0=1; RP_7730_1=1; RP_7730_2=0; RP_7730_3=1; RP_7730_4=0; RP_7730_5=0; RP_7730_6=0; RP_7730_7=1; RP_7730_8=1; RP_7730_9=0; RP_7730_10=0; RP_7730_11=0; RP_7730_12=1; RP_7730_13=0; RP_7730_14=0; RP_7730_15=0; WriteAD7730(16); while (RDY_Pin_7730==1) { } // READ ADC RP_7730_0=0; RP_7730_1=0; RP_7730_2=0; RP_7730_3=0; RP_7730_4=0; RP_7730_5=0; RP_7730_6=0; RP_7730_7=1; WriteAD7730(8); ReadAD7730(); longwordtostr(Cod7730,Cod7730TX); //UART1_Write_Text(Cod7730TX); //UART1_Write_Text("&"); } } Во-первых, drdy долгое время не уходил в 0, а на cs я в самом начале подавал 0. Тогда drdy всегда был 1, но калибровка шла, точнее биты правильно устанавливались. Теперь же, когда я изменил биты в mode регистр(вроде CLKDIS), то drdy приходится ждать долго, бывает от 2 до 10 секунд на переход в 0. Это нормально? Во-вторых, все биты вроде как правильно устанавливаются, за исключением - калибровки. В режиме mode кроме первых, отвечающих за калибровку все устанавливаются, а вот 3-три первых ни в какую. В чём моя ошибка? USE CODEBOX instead of CODE в случае длинной программы. Т. Модератор.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|