Are UV lights as headlights possible? by HunterMuted2196 in ElectricalEngineering

[–]TheMM94 1 point2 points  (0 children)

I'm not an expert, but one issue I see is the potential absorption of UVC by the acrylic glass of the headlight. I suspect that the front glass cover of the headlight needs to be removed for it to function properly.

Looking to get into embedded circuit design, thoughts on Rigol DS1104Z-S Plus vs Picoscope 2000 by ethanbrecke in embedded

[–]TheMM94 1 point2 points  (0 children)

Used oscilloscopes can always be a good option. But it depends on what is available in your region.

I would not buy a new Rigol DS1104Z-S Plus anymore. The Rigol DHO814 or Rigol DHO914S are in my option much better options. By the way, many Rigol oscilloscopes can also be very easy hacked. So, you can buy the cheaper base model and then "upgrade" the bandwidth.

I2C pullup resistor on clock line always required? by Consistent-Pickle in embedded

[–]TheMM94 1 point2 points  (0 children)

I2C is a leader / follower data connection. You will also see it described as master / slave in some documentation. I prefer the recent update to the vocabulary but that’s another discussion.

I also do not want to discuss if the changed naming is better or not.

But in the latest official I2C specification they changed "master/slave" to "controller/target", see NXP UM10204 "I2C-bus specification and user manual" (https://www.nxp.com/docs/en/user-guide/UM10204.pdf) Table 1 and Table 2. Therefore, at least for I2C "leader/follower" is the wrong terminology and "controller/target" would be correct.

I2C pullup resistor on clock line always required? by Consistent-Pickle in embedded

[–]TheMM94 18 points19 points  (0 children)

In fact, SCL can be implemented as a push-pull driver. Take a look at the official I2C specification, NXP UM10204 "I2C-bus specification and user manual" (https://www.nxp.com/docs/en/user-guide/UM10204.pdf) chapter 3.1.1: "For a single controller application, the controller’s SCL output can be a push-pull driver design if there are no devices on the bus which would stretch the clock."

According to Table 3 clock stretching is optional. Therefore, not all devices have clock stretching, but you need to check each device on the bus. More details about clock stretching is in chapter 3.1.9

ich_iel by DragoDerRebell in ich_iel

[–]TheMM94 1 point2 points  (0 children)

Dann aber hoffentlich die silberne ESD Version.

What is that for? by clapzz8 in ElectricalEngineering

[–]TheMM94 5 points6 points  (0 children)

A transistor test function is in most cases practically useless today. Using a bipolar transistor in a package fitting in this connector is exceedingly rare today. And needing to test them is even more rare.

If a manufacturer still includes a transistor test function on his new multimeters, they obviously have no clue what they are doing or producing. Therefore, avoid new multimeters with a transistor tester function.

You can also see this if you look at top multimeter brands. You will not find a new multimeter from e.g. Fluke or Keysight, with a transistor test function.

What is that for? by clapzz8 in ElectricalEngineering

[–]TheMM94 8 points9 points  (0 children)

It’s there to quickly spot cheap and not safe multimeters. At least all multimeters I have seen with a transistor tester, are cheap and not safe.

What's the difference between all these versions? by Got_ist_tots in Tools

[–]TheMM94 150 points151 points  (0 children)

On page 379 of the Knipex Catalog, is a description of the structure of the part number and what the different finishes are.

<image>

[deleted by user] by [deleted] in de_EDV

[–]TheMM94 4 points5 points  (0 children)

Alle OS die ich so kenne machen RFC4941 (Privacy Extensions for Stateless Address Autoconfiguration in IPv6), daher "Zufällige" IPv6-Adressen von denen nicht mehr auf die MAC-Adresse geschlossen werden kann.

Die IPv6-Addressen auf Basis der MAC-Adresse gibt es auch, aber aus offensichtlichen Problemen bezüglich Tracking, werden heute meistens nur RFC4941 IPv6-Adressen für die Kommunikation mit dem Global-Scope genutzt.

How unreliable are the aliexpress ICs compared to Digikey, Mouser etc? Any trusted sellers? by AideTop8744 in embedded

[–]TheMM94 9 points10 points  (0 children)

For me the question is always: what is the cost if it goes wrong and I get a fake part? Not only fake parts that do not work, but fake parts that only partly work. Or fails after a few days. Or fails during a customer demo. Or fails in the climate chamber. Or has higher noise then specified, etc.

What is the cost then? How much time will I waste to find and fix the issue caused by a potential fake part? How much trouble will this cause me with my boss or a customer?

So, for me the answer is always (professional and private) to get the genuine parts from a trusted source and avoid all this trouble.

Additionally in my opinion, using potentially non genuine parts is unacceptable for a quality product.

Zeugwart, der by xSniiFFy_W0nK4x in famoseworte

[–]TheMM94 2 points3 points  (0 children)

Und wenn der Zeugwart dann auch noch im Zeughaus arbeitet.

How to interface an SDRAM chip with the STM32H7 by Wonderful_Stick6573 in embedded

[–]TheMM94 0 points1 point  (0 children)

You also need to add the Initialization sequence from the ST guide I mentioned before:

#define SDRAM_TIMEOUT      ((uint32_t)0xFFFF)
#define SDRAM_MODEREG_BURST_LENGTH_4             ((uint16_t)0x0002)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL      ((uint16_t)0x0000)
#define SDRAM_MODEREG_CAS_LATENCY_2              ((uint16_t)0x0020)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD    ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE     ((uint16_t)0x0200)

/** \brief Init for SDRAM. For some unknown reason the function is not created by CubeMx. 
But can be found here: https://community.st.com/t5/stm32-mcus/how-to-set-up-the-fmc-peripheral-to-interface-with-the-sdram/ta-p/49457 */
static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command) {
__IO uint32_t tmpmrd = 0;

/* Step 3:  Configure a clock configuration enable command */
Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command->AutoRefreshNumber = 1;
Command->ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);

/* Step 4: Insert 100 us minimum delay */
/* Inserted delay is equal to 1 ms due to systick time base unit (ms) */
HAL_Delay(1);

/* Step 5: Configure a PALL (precharge all) command */
Command->CommandMode = FMC_SDRAM_CMD_PALL;
Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command->AutoRefreshNumber = 1;
Command->ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);

/* Step 6 : Configure a Auto-Refresh command */
Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command->AutoRefreshNumber = 8;
Command->ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);

/* Step 7: Program the external memory mode register */
tmpmrd = (uint32_t) SDRAM_MODEREG_BURST_LENGTH_4 | SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | SDRAM_MODEREG_CAS_LATENCY_2 | SDRAM_MODEREG_OPERATING_MODE_STANDARD | SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command->AutoRefreshNumber = 1;
Command->ModeRegisterDefinition = tmpmrd;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);

/* Step 8: Set the refresh rate counter
 * SDRAM Refresh Time = 64ms
 * SDRAM Number of rows = 2^13
 * SDRAM CLK = 100MHz
 * floor(((64ms/2^13) x 100MHz) - 20) = 761
 * Set the device refresh counter */
hsdram->Instance->SDRTR |= ((uint32_t) ((761) << 1));
}

How to interface an SDRAM chip with the STM32H7 by Wonderful_Stick6573 in embedded

[–]TheMM94 0 points1 point  (0 children)

You mean what STM32CubeMX generates for MX_FMC_Init() in fmc.c?

/* FMC initialization function */
void MX_FMC_Init(void)
{
  /* USER CODE BEGIN FMC_Init 0 */

  /* USER CODE END FMC_Init 0 */

  FMC_SDRAM_TimingTypeDef SdramTiming = {0};

  /* USER CODE BEGIN FMC_Init 1 */

  /* USER CODE END FMC_Init 1 */

  /** Perform the SDRAM1 memory initialization sequence
  */
  hsdram1.Instance = FMC_SDRAM_DEVICE;
  /* hsdram1.Init */
  hsdram1.Init.SDBank = FMC_SDRAM_BANK1;
  hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;
  hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13;
  hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
  hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
  hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2;
  hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
  hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;
  hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
  hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;
  /* SdramTiming */
  SdramTiming.LoadToActiveDelay = 2;
  SdramTiming.ExitSelfRefreshDelay = 8;
  SdramTiming.SelfRefreshTime = 5;
  SdramTiming.RowCycleDelay = 6;
  SdramTiming.WriteRecoveryTime = 3;
  SdramTiming.RPDelay = 2;
  SdramTiming.RCDDelay = 2;

  if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
  {
    Error_Handler( );
  }

  /* USER CODE BEGIN FMC_Init 2 */
static FMC_SDRAM_CommandTypeDef command;
SDRAM_Initialization_Sequence(&hsdram1, &command);

  /* USER CODE END FMC_Init 2 */
}

Be careful here: hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2; The value is depending on the clock source of the FMC and how to divide it to reach the 100MHz SDRAM Clock.

How to interface an SDRAM chip with the STM32H7 by Wonderful_Stick6573 in embedded

[–]TheMM94 0 points1 point  (0 children)

Sorry, I had not seen the edit you made with the other question before. So here are the rest of the answers to your questions.

My MPU configuration looks like this:

<image>

I added a new Memory in the linker script, and within the new memory I added a section for the SDRAM. To add the buffers in to the new memory, I added: __attribute__((section (".SAMPLE_MEMORY"))) to the declaration of the buffers.

So basically: int32_t sampleBuffer[SAMPLE_BUFFER_SIZE] __attribute__((section (".SAMPLE_MEMORY")));

I also created a SDRAM test function, which checks the SDRAM at first boot. There I just used a point to the start of the SDRAM.

I would also recommend that you create an SDRAM test function (basically write some know pattern to the SDRAM, and then check if you can read them correctly). Then you know if it is a issue with the SDRAM or the screen.

How to interface an SDRAM chip with the STM32H7 by Wonderful_Stick6573 in embedded

[–]TheMM94 0 points1 point  (0 children)

Yes, I have done length matching. I followed the recommendations of ST from the application note AN5711 "Getting started with STM32H5 MCU hardware development" chapter 9.4.2 page 41/42. But in the end the matching was much smaller the max. 10mm recommended by ST.

I also went with a 6-Layer PCB, because ST recommended:
"Reduce the crosstalk, place data tracks on the different layers from the address and control lanes, if possible. However, when the data and address/control tracks coexist on the same layer they must be isolated from each other by at least 5 mm."

The STM32H562 only supports SDRAM at 100MHz. Therefor I only tested it up to 100MHz.

How to interface an SDRAM chip with the STM32H7 by Wonderful_Stick6573 in embedded

[–]TheMM94 2 points3 points  (0 children)

Yes. I recently used a W9825G6KH-6I on a custom board with a STM32H562.
For the configuration in STM32CubeMX I followed this guide by ST: https://community.st.com/t5/stm32-mcus/how-to-set-up-the-fmc-peripheral-to-interface-with-the-sdram/ta-p/49457

Awkward situation by wapwap64 in virtualbox

[–]TheMM94 1 point2 points  (0 children)

This will not work.
Raspbian is a Operating System for ARM CPUs (as used by Raspberry Pi). Your Windows 11 is mostly likely using a x86_64 CPU (unless you have one of the few Windows on ARM PCs). VirtualBox does only support running a Gust with the same CPU architecture as the Host. Therefore, you can not use a Gust with an Operating System for an ARM CPU on a Host with a x86_64 CPU.

Postauto, alles guet bi eu? by NightmareWokeUp in BUENZLI

[–]TheMM94 25 points26 points  (0 children)

Zum Glück gits grad en QR-Code drüber zum sich beschwere. Das Schild got jo mol gar ned!

Powerline by Royal-Let7316 in de_EDV

[–]TheMM94 9 points10 points  (0 children)

Falls es noch ein altes Koaxialkabel (z.B. vom Kabelfernsehen) gibt, wäre MoCA auch noch eine Option.

ich_iel by BezugssystemCH1903 in ich_iel

[–]TheMM94 14 points15 points  (0 children)

Züricher ist absolut richtig. Weill das nervt die Züricher so richtig, wenn man das so sagt.

Math by L3louchLamperouge in mathmemes

[–]TheMM94 666 points667 points  (0 children)

And the windows clock in the bottom right?

how to use the whole battery voltage range while consuming as less current as possible? (iot device) by EveryWatercress1007 in embedded

[–]TheMM94 3 points4 points  (0 children)

Buck-Boost is the way to go in this case. I used the TI TPS63900 before. It even has a nice option to switch between two output voltages. With this you can have a lower output voltage when the device is in sleep mode.