Zx80 0 Posted December 24, 2021 · Report post Quote Чтобы выбрать канал - надо записать в сам Communications Register значение вида 0b00000xxx, где ххх - номер канала. ну ка найдите здесь установку номера канала Quote Ответить с цитированием Share this post Link to post Share on other sites
Zx80 0 Posted December 24, 2021 · Report post Нашел у себя ошибку. Я должен читать по коменде 0х5С а не по 0х5F. Возвращаемое значение изменилось. Но все равно возвращается один байт. Quote Ответить с цитированием Share this post Link to post Share on other sites
Сергей Борщ 0 Posted December 24, 2021 · Report post 31 минуту назад, Zx80 сказал: Но все равно возвращается один байт Как он может возвращаться один, если такты для всех байтов генерите вы? Хотите читать 10 байтов - пошлите 10 байтов мусора, таков SPI. Quote Ответить с цитированием Share this post Link to post Share on other sites
Plain 0 Posted December 24, 2021 · Report post 6 часов назад, Zx80 сказал: Не представляю как Вам дать такую диаграмму. Осцилограф двулучевой. Скажу только что CS = 0 у меня завсегда Если CS не используется, тогда паспорт требует программно сбрасывать интерфейс 4-мя пустыми байтами. И далее, Вам здесь уже каждый первый ответил, действовать точно так же — чтобы прочитать 3 байта данных, требуется написать руками код, посылающий по SPI четыре байта, и вот этот код можно показать здесь вместо осциллограмм. Quote Ответить с цитированием Share this post Link to post Share on other sites
Zx80 0 Posted December 29, 2021 (edited) · Report post spiInit(); InitAD7714(); DDRD |= (0<<DDD2); PORTD |= (1<<PORTD2); DDRD |= (1<<DDD6); PORTD |= (0<<PORTD6); while (1) { // Place your code here // if(PIND.2 == 0) // PORTD.6 = 0; // else // PORTD.6 = 1; unsigned char res[3]={255,255,255}; if(PIND.2 == 0) { spiWrite(0x5C); spiWrite(0xFF); res[0] = spiRead(); spiWrite(0xFF); res[1] = spiRead(); spiWrite(0xFF); res[2] = spiRead(); displayAD7714Result(res); } delay_ms(20); } } void InitAD7714() { // spiWrite(0x27); /* set the channel AIN6 and set the next operation as write to the filter high */ // spiWrite(0x4F); /* set Bipolar mode, 24 bits, boost off, all 4 MSBs of filterword to 1 */ // spiWrite(0x37); /* set the next operation as a write to the filter low register channel AIN6 */ // spiWrite(0xA0); /* max filter word allowed for low part of the filterword */ // spiWrite(0x17); /* set the operation as a write to the mode register */ // spiWrite(0x20); /* set gain to 1, burnout current off, no filter sync, and do a self calibration */ spiWrite(0x24); /* set the channel AIN1-AIN2 and set the next operation as write to the filter high */ spiWrite(0x4F); /* set Bipolar mode, 24 bits, boost off, all 4 MSBs of filterword to 1 */ spiWrite(0x34); /* set the channel AIN1-AIN2 the next operation as a write to the filter low register channel AIN1/AIN2 */ spiWrite(0xA0); /* max filter word allowed for low part of the filterword */ spiWrite(0x14); /* set the channel AIN1-AIN2 the operation as a write to the mode register.*/ spiWrite(0x20); /* set gain to 1, burnout current off, no filter sync, and do a self calibration */ } void spiInit(void) { /* Set MOSI, SCK, SS as output */ DDRB |= ((1<<SPI_DDR_MOSI) | (1<<SPI_DDR_SS) | (0<<SPI_DDR_MISO) | (1<<SPI_DDR_SCK)); PORTB &= ~((1<<SPI_PORT_MOSI) | (1<<SPI_PORT_SS) | (1<<SPI_PORT_MISO) | (1<<SPI_PORT_SCK)); /* Enable SPI, Master, set clock rate fck/16 */ SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //SPDR = 0b00000000; } void spiWrite(unsigned char cData) { /* Start transmission */ SPDR = cData; /* Wait for transmission complete */ while(!(SPSR & (1<<SPIF))); } unsigned char spiRead() { /* Wait for reception complete */ while(!(SPSR & (1<<SPIF))); /* Return data register */ return SPDR; } Осцилограмма на SCK. Посылаются байты 0х5С, 0хFF, 0хFF, 0хFF. По идее я должен видеть байты результата на DOUT, но ничего там не вижу. Подскажите ? Edited December 29, 2021 by Zx80 Quote Ответить с цитированием Share this post Link to post Share on other sites
Zx80 0 Posted December 30, 2021 (edited) · Report post Привет. Я в ступоре. Раз не работает решил записать одну команду и ее же прочитать. На SCK вижу такты для каждого из четырех комманд. На DIN вжу данные четырех комманд. на DOUT вижу ноль. Ау помогите. spiWrite(0x24); /* команда установить канал AIN1-AIN2. И передать данные в старшую часть фильтра. spiWrite(0xAA); /* данные для старшей части фильтра spiWrite(0x2C); /* прочитать данные из старшей части фильтра spiWrite(0xAA); /* байт толкатель для генерации SCK поменял чип и увидел на DOUT эт че получается чип паленый. Я не палил. А что это за шум перед переходом в ноль ? Случайно этот выход не открытый коллектор ? Edited December 30, 2021 by Zx80 Quote Ответить с цитированием Share this post Link to post Share on other sites
Plain 0 Posted December 30, 2021 · Report post 35 минут назад, Zx80 сказал: помогите Да уже много раз пробовали — начиная с того, чтобы выкинуть нерабочую схему, и заканчивая сбросом — всё без толку. Quote Ответить с цитированием Share this post Link to post Share on other sites
HardEgor 0 Posted December 30, 2021 · Report post 6 часов назад, Zx80 сказал: эт че получается чип паленый. Я не палил. А что это за шум перед переходом в ноль ? Случайно этот выход не открытый коллектор ? нет - это схема переходит в z-состояние и разряжается емкость монтажа. Quote Ответить с цитированием Share this post Link to post Share on other sites
Zx80 0 Posted December 31, 2021 (edited) · Report post Plain, ваши ответы всегда напоминают ответы продавцов, "покупайте что мы привезли, никого не волнует то что вам надо" Quote Да уже много раз пробовали — начиная с того, чтобы выкинуть нерабочую схему, и заканчивая сбросом — всё без толку. Edited December 31, 2021 by Zx80 Quote Ответить с цитированием Share this post Link to post Share on other sites
Herz 0 Posted January 1 · Report post 19 часов назад, Zx80 сказал: Plain, ваши ответы всегда напоминают ответы продавцов, "покупайте что мы привезли, никого не волнует то что вам надо" А Ваши вопросы напоминают вопросы прогульщика уроков. 30.12.2021 в 14:50, Zx80 сказал: На SCK вижу такты для каждого из четырех комманд. На DIN вжу данные четырех комманд. Ау помогите. эт че получается чип паленый. Напоминаю Вам п.2.1.в Правил форума. Quote Ответить с цитированием Share this post Link to post Share on other sites
Zx80 0 Posted January 1 · Report post Quote Да уже много раз пробовали — начиная с того, чтобы выкинуть нерабочую схему, и заканчивая сбросом — всё без толку. Извините, а как мне реагировать на первую часть этой фразы повторяемой с не виданным упорством. Я же ответил, задание мне сделать именно на AD7714. Что не понятного, зачем тогда такой ответ? Про сброс разговора не было, сброс у меня организован. Я сократил поле до записи одной команды, и ее чтения, в ответ в 50й раз у вас чип не такой. Что ж это за помощь(совет) ? Quote Ответить с цитированием Share this post Link to post Share on other sites
Herz 0 Posted January 1 · Report post 2 часа назад, Zx80 сказал: в ответ в 50й раз у вас чип не такой. Что ж это за помощь(совет) ? Так Вы ещё и читать не умеете? Тогда все советы будут бесполезными. Где, хоть раз (!?) Вам написали, что у Вас "чип не такой"? Quote Ответить с цитированием Share this post Link to post Share on other sites
Plain 0 Posted January 1 · Report post 2 часа назад, Zx80 сказал: зачем тогда такой ответ? Совет был — выбросить ОУ и прочее, затем подключить датчик правильно и в мост, для измерений на переменном токе, и добавить защиту на каждый из 6-ти входных контактов, а советов выкинуть AD7714 лично я не давал — отличный АЦП, если прочитать его паспорт и затем делать так, как там написано. И ещё, Вы сразу сказали, что оригинальный экземпляр платы у Вас издох от неосторожного с ней обращения — Ваше право полагать, что её немецкие авторы тут не при чём, но другие участники форума уверены в обратном. Quote Ответить с цитированием Share this post Link to post Share on other sites
Zx80 0 Posted January 3 · Report post Привет. Давайте так, у меня два топика - ацп и оу. В теме про ацп, обсуждаем ацп, в теме про оу обсуждаем оу. Не влазит слон в рот, давайте его есть по кускам. Я так и начал. Привел инициализацию старшей части фильтра и попытку ее считать. spiWrite(0x24); /* команда установить канал AIN1-AIN2. И передать данные в старшую часть фильтра. spiWrite(0xAA); /* данные для старшей части фильтра spiWrite(0x2C); /* прочитать данные из старшей части фильтра spiWrite(0xFF); /* байт толкатель для генерации SCK void spiWrite(unsigned char cData) { /* Start transmission */ SPDR = cData; /* Wait for transmission complete */ while(!(SPSR & (1<<SPIF))); } unsigned char spiRead() { /* Wait for reception complete */ while(!(SPSR & (1<<SPIF))); /* Return data register */ return SPDR; } осцилограмму на SCK показываю, что вижу такты на эти команды. На выводе DOUT вижу ноль, с некоторым различием при смене экземпляра чипа. Всего одна команда, всего одно считывание. Подскажете мою ошибку. Quote Ответить с цитированием Share this post Link to post Share on other sites
dimka76 0 Posted January 3 · Report post 6 hours ago, Zx80 said: На выводе DOUT вижу ноль, с некоторым различием при смене экземпляра чипа. Всего одна команда, всего одно считывание. Подскажете мою ошибку. 1. Вы бы двумя каналами осциллографа работали и приводили осциллограммы с двух каналов. 2. Вы не привели марку микроконтроллера. И обычно у AVR один SPI. И по нему же он прошивается. Если вы после прошивки МК не передергиваете питание или не подаете сброс на АЦП, то возможно АЦП рассинхронизирован. Вам уже тут советовали отправлять 4-е фиктивных байта по SPI, чтобы восстановить синхронизацию. 3. Может у вас просто короткое замыкание по линии DOUT АЦП или наоборот обрыв или непропай. Quote Ответить с цитированием Share this post Link to post Share on other sites