EERAM 5v 点击47L04/47C04/47L16/47C16

问题描述 投票:0回答:1

我尝试使用 Arduino 简单地从以下模块写入和读取字节/位:

https://download.mikroe.com/documents/datasheets/47L16.pdf

https://www.mikroe.com/eeram-5v-click

我正在尝试写入 01010101,但接收到 11111111 作为读取写入数据的输出。

我正在尝试写入 01010101,但接收到 11111111 作为读取写入数据的输出。

#include <Wire.h>

const uint8_t deviceAddress = 0x50; // Change to your device address
const uint8_t registerAddress = 0x01; // Register address (change if necessary)
const uint8_t dataToWrite = 0b01010101; // Data to write (0xAA)

void setup() {
  Serial.begin(9600);
  Wire.begin();

  // Write data to the device
  writeData(registerAddress, dataToWrite);
  delay(100); // Short delay before reading
}

void loop() {
  // Read the data back from the device
  readData(registerAddress);
  
  delay(2000); // Wait for 2 seconds before the next read
}

void writeData(uint8_t registerAddress, uint8_t data) {
  Wire.beginTransmission(deviceAddress); // Start communication
  Wire.write(registerAddress); // Write register address
  Wire.write(data); // Write the data to the register
  if (Wire.endTransmission() != 0) {
    Serial.println("Error: Write operation failed!");
  } else {
    Serial.print("Written Data: ");
    Serial.println(data, BIN); // Print written data in binary format
  }
}

void readData(uint8_t registerAddress) {
  Wire.beginTransmission(deviceAddress); // Start communication
  Wire.write(registerAddress); // Write the register address to read from
  if (Wire.endTransmission() != 0) {
    Serial.println("Error: Read address transmission failed!");
    return; // Exit if transmission fails
  }

  Wire.requestFrom(deviceAddress, 1); // Request 1 byte from the device
  if (Wire.available()) {
    uint8_t receivedByte = Wire.read(); // Read the byte
    Serial.print("Received Data: ");
    Serial.println(receivedByte, BIN); // Print received byte in binary format
  } else {
    Serial.println("No data available.");
  }
}

c++ arduino
1个回答
0
投票

经过大量的试验和错误,我为其他感兴趣的人提供了一个工作脚本:

'''

#include <Wire.h>

const uint8_t deviceAddr = 0x50; // Adjust based on your SRAM chip configuration
uint16_t writeAddr = 0x0000;      // Starting address to write/read
uint16_t valueToWrite = 0xAA55;    // Initial value to write to SRAM (16-bit word)

void setup() {
  Serial.begin(9600); // Initialize serial communication
  Wire.begin();       // Initialize I2C (Wire) library
  pinMode(9, OUTPUT); // Set pin 9 as PWM output

  // Write 0x0000 to reset the memory before the main loop
  writeSRAM(deviceAddr, writeAddr, 0x0000);
  Serial.println("Setup complete.");
}

void loop() {
  // Write data to SRAM
  writeSRAM(deviceAddr, writeAddr, valueToWrite);
  Serial.print("Data written at address 0x");
  Serial.print(writeAddr, HEX);
  Serial.print(": 0x");
  Serial.println(valueToWrite, HEX);

  // Read data from SRAM immediately after writing
  uint16_t data = readCurrentAddressSRAM(deviceAddr);
  Serial.print("Data read after write: 0x");
  Serial.println(data, HEX); // Print the read value

  // Adjust the PWM signal based on the read value (lower 8 bits)
  analogWrite(9, data & 0xFF); // Write the lower byte as PWM to pin 9

  // Evolve the valueToWrite and writeAddr
  valueToWrite += 1; // Increment the value by 1
  if (valueToWrite > 0xFFFF) { // Reset if it exceeds 16 bits
    valueToWrite = 0x0000; 
  }

  writeAddr += 2; // Increment the address by 2 (to write the next word)
  if (writeAddr > 0xFFFF) { // Reset if it exceeds 16 bits
    writeAddr = 0x0000; 
  }

  // Wait for 2 seconds before the next iteration
  delay(2000);
}

void writeSRAM(uint8_t deviceAddr, uint16_t memAddr, uint16_t data) {
  Wire.beginTransmission(deviceAddr); // Begin transmission to the device
  Wire.write((memAddr >> 8) & 0xFF);  // Send high byte of address
  Wire.write(memAddr & 0xFF);          // Send low byte of address
  Wire.write((data >> 8) & 0xFF);      // Send high byte of data
  Wire.write(data & 0xFF);             // Send low byte of data
  Wire.endTransmission();              // End transmission
  
  delay(20); // Additional delay to ensure data is latched properly
}

uint16_t readCurrentAddressSRAM(uint8_t deviceAddr) {
  Wire.beginTransmission(deviceAddr);  // Begin transmission to the device
  Wire.write((writeAddr >> 8) & 0xFF); // Send high byte of address
  Wire.write(writeAddr & 0xFF);         // Send low byte of address
  Wire.endTransmission();               // End transmission

  Wire.requestFrom(deviceAddr, 2);     // Request two bytes from the device
  if (Wire.available() >= 2) {
    uint16_t highByte = Wire.read();    // Read the high byte
    uint16_t lowByte = Wire.read();     // Read the low byte
    return (highByte << 8) | lowByte;   // Combine into a 16-bit word
  }
  return 0;                             // Return 0 if no bytes were read
}

'''

© www.soinside.com 2019 - 2024. All rights reserved.