Привет!)
И так, в моей жизни наступил такой момент, когда стало жизненно необходимо использовать связку atmega + 23LCV512 (она же SRAM, версия на 64 кб) + SN74HC165N (сдвиговый регистр дающий на вход + 8 пинов).
Столкнулся с такой проблемой: при подключении сразу двух этих устройств к одной шине SPI я теряю возможность работать co SRAM модулем.
Проблема вылезла при попытке внедрить ее в уже работающий большой проект, но чтобы не вываливать сюда огромную кучу незаконченных схем я вытащил проблему в небольшую схему и повторил ее.
Далее привожу две схемы:
	
	
		
			
	
Проблема выглядит таким образом:
При подключении одной лишь 23LC я могу свободно работать с памятью на запись и чтение.
Если в схеме появляется 74HC165, я эту возможность теряю, однако работать со сдвиговым регистром могу. При попытке прочитать память получаю сплошные нули.
Если у регистра отключить ногу MISO, возможность возвращается.
Выглядит так, будто CE у регистра игнорирует логическую единицу, хотя она точно подается.
Код:
	
	
		
			
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
		
	
Так же снял на видео демонстрацию самой проблемы:
	
	
		
			
	
		
	
		
	
Джентльмены, с этой проблемой я столкнулся еще пол года назад, и до сих пор ее не решил. Уже и не помню как пробовал ее решить. Я правда заинтересован в решении этой проблемы!
Оговорюсь сразу, в схемотехнике я хоть и не первый день, но я не специалист, и даже не любитель.
Буду благодарен каждому при любой попытке помочь.
								И так, в моей жизни наступил такой момент, когда стало жизненно необходимо использовать связку atmega + 23LCV512 (она же SRAM, версия на 64 кб) + SN74HC165N (сдвиговый регистр дающий на вход + 8 пинов).
Столкнулся с такой проблемой: при подключении сразу двух этих устройств к одной шине SPI я теряю возможность работать co SRAM модулем.
Проблема вылезла при попытке внедрить ее в уже работающий большой проект, но чтобы не вываливать сюда огромную кучу незаконченных схем я вытащил проблему в небольшую схему и повторил ее.
Далее привожу две схемы:
P.S.: на схеме изображен hc595, но на самом деле я использую hc165, просто не нашел нужный компонент
Красный - плюс
Черный - масса
Оранжевый - SPI clock
Фиолетовый - MISO
Синий MOSI
Желтый - CE для 23LC (SRAM)
Зеленый - CE для 74HC165
Голубой - PL для 74HC165, она же защелка для перехвата состояния портов ввода микросхемы.
Работает:

Не работает:

		Красный - плюс
Черный - масса
Оранжевый - SPI clock
Фиолетовый - MISO
Синий MOSI
Желтый - CE для 23LC (SRAM)
Зеленый - CE для 74HC165
Голубой - PL для 74HC165, она же защелка для перехвата состояния портов ввода микросхемы.
Работает:

Не работает:

Проблема выглядит таким образом:
При подключении одной лишь 23LC я могу свободно работать с памятью на запись и чтение.
Если в схеме появляется 74HC165, я эту возможность теряю, однако работать со сдвиговым регистром могу. При попытке прочитать память получаю сплошные нули.
Если у регистра отключить ногу MISO, возможность возвращается.
Выглядит так, будто CE у регистра игнорирует логическую единицу, хотя она точно подается.
Код:
			
				C++:
			
		
		
		//-------------MEMORY------------------
#define MEMORY_RDSR        5
#define MEMORY_WRSR        1
#define MEMORY_READ        3
#define MEMORY_WRITE       2
#include "SPI.h"
int pinPL = 5;
int pinCE = 4;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  //Инициализирую SPI
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV4);
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  //Готовлю к работе память
  memoryInit();
  //Готовлю к работе регистр
  pinMode(pinPL, OUTPUT);
  pinMode(pinCE, OUTPUT);
  digitalWrite(pinPL, HIGH);
  digitalWrite(pinCE, HIGH);
  delay(1000);
  //Операции ввода вывода в цикле при старте
  for (uint8_t i=0; i<32; i++)
  {
    memoryWriteByte(0, i);
    uint8_t value = memoryReadByte(0);
    Serial.println(value);
    
  }
}
void loop() {
  // put your main code here, to run repeatedly:
  delay (1000);
  //Перехватываю состояние портов ввода у регистра
  digitalWrite(pinPL, LOW);
  delay(5);
  digitalWrite(pinPL, HIGH);
  //Получаю данные с регистра
  digitalWrite(pinCE, LOW);
  uint8_t value = SPI.transfer(0);
  digitalWrite(pinCE, LOW);
  Serial.println(value);
}
void memoryInit()
{
  pinMode(6, OUTPUT);
  memoryClose();
}
void memoryOpen()
{
  digitalWrite(6, LOW);
  delay(5);
}
void memoryClose()
{
  digitalWrite(6, HIGH);
  delay(5);
}
void memoryWriteByte(uint32_t address, uint8_t data_byte)
{
  memoryOpen();
  SPI.transfer(MEMORY_WRITE);
  SPI.transfer((uint8_t)(address >> 16) & 0xff);
  SPI.transfer((uint8_t)(address >> 8) & 0xff);
  SPI.transfer((uint8_t)address);
  SPI.transfer(data_byte);
  memoryClose();
}
uint8_t memoryReadByte(uint32_t address)
{
  memoryOpen();
  SPI.transfer(MEMORY_READ);
  SPI.transfer((uint8_t)(address >> 16) & 0xff);
  SPI.transfer((uint8_t)(address >> 8) & 0xff);
  SPI.transfer((uint8_t)address);
  uint8_t result = SPI.transfer(0x00);
  memoryClose();
  return result;
}Так же снял на видео демонстрацию самой проблемы:
Джентльмены, с этой проблемой я столкнулся еще пол года назад, и до сих пор ее не решил. Уже и не помню как пробовал ее решить. Я правда заинтересован в решении этой проблемы!
Оговорюсь сразу, в схемотехнике я хоть и не первый день, но я не специалист, и даже не любитель.
Буду благодарен каждому при любой попытке помочь.
 
				
		 
 
		 
 
		 
					
				 
						
					