Explorar o código

Fix I²C errors

Benjamin Harris hai 1 mes
pai
achega
db518ae1a9
Modificáronse 3 ficheiros con 11 adicións e 7 borrados
  1. 4 2
      DSPWriter.cpp
  2. 1 1
      DSPWriter.h
  3. 6 4
      ModulosDSP_101.ino

+ 4 - 2
DSPWriter.cpp

@@ -15,7 +15,7 @@ void DSPWriter::downloadProgram()
     DSPWriter::writeRegisterBlock(REG_COREREGISTER_IC_1_ADDR, REG_COREREGISTER_IC_1_BYTE, R4_COREREGISTER_IC_1_Default, CORE_REGISTER_R4_REGSIZE);*/
 }
 
-void DSPWriter::writeRegisterBlock(uint16_t subAddress, int dataLength, const uint8_t* pdata, uint8_t registerSize)
+bool DSPWriter::writeRegisterBlock(uint16_t subAddress, int dataLength, const uint8_t* pdata, uint8_t registerSize)
 {
     uint16_t bytesSent = 0;
 
@@ -41,12 +41,14 @@ void DSPWriter::writeRegisterBlock(uint16_t subAddress, int dataLength, const ui
 
         if (err != 0) {
             // 1 = data too long, 2 = NACK addr, 3 = NACK data, 4 = other
-            // Caller can check Serial output; silent continue to attempt remaining blocks
+            Serial.printf("I2C NACK addr=0x%04X err=%u\n", subAddress, err);
+            return false;
         }
 
         subAddress++;
         delay(0);
     }
+    return true;
 }
 
 void DSPWriter::writeRegister(uint16_t memoryAddress, uint8_t length, const uint8_t* data)

+ 1 - 1
DSPWriter.h

@@ -75,7 +75,7 @@ public:
       const uint8_t *pdata;             Data array to write
       uint8_t registerSize;             Number of bytes each register can hold
     ***************************************/
-    static void writeRegisterBlock(uint16_t subAddress, int dataLength, const uint8_t* pdata, uint8_t registerSize);
+    static bool writeRegisterBlock(uint16_t subAddress, int dataLength, const uint8_t* pdata, uint8_t registerSize);
 
     /***************************************
     Function: writeRegister()

+ 6 - 4
ModulosDSP_101.ino

@@ -608,6 +608,7 @@ static void handleTcpBridgeClient(WiFiClient& client)
         Serial.printf("TCP WRITE addr=0x%04X len=%u regSz=%u safeload=%u\n",
                       writeHeader.address, writeHeader.dataLen, registerSize, writeHeader.safeload);
 
+        bool writeOk = true;
         if (writeHeader.safeload == 1) {
           if (writeHeader.dataLen % 4 != 0) {
             Serial.printf("TCP safeload dataLen %u not multiple of 4\n", writeHeader.dataLen);
@@ -623,13 +624,14 @@ static void handleTcpBridgeClient(WiFiClient& client)
             regAddress++; slri += 4; writeCount--; delay(0);
           }
         } else {
-          DSPWriter::writeRegisterBlock(regAddress, writeHeader.dataLen,
-                                        &dataBuffer[readIndex], registerSize);
+          writeOk = DSPWriter::writeRegisterBlock(regAddress, writeHeader.dataLen,
+                                                  &dataBuffer[readIndex], registerSize);
+          if (!writeOk) Serial.println("TCP DSP block write failed");
         }
 
         readIndex += writeHeader.dataLen;
-        sendWriteAck(client, true);
-        ledOff();
+        if (!writeOk) ledErrorFlash(); else ledOff();
+        sendWriteAck(client, writeOk);
         currentState = STATE_START;
         processedSomething = true;
         continue;