我有一个char数组,其中从一些EEPROM设备读取数据,在硬件中,如果没有数据,它的值可以是任何(垃圾).
我想检查他的值是不是垃圾并且有一些有效的字符.
for(int k=address;k<address+MEM_MAX_LEN;k++)
{
charBuf[k-address]= EEPROM.read(k);
if(charBuf[k-address]=='*')
{
charBuf[k-address]='\0';
break;
}
Run Code Online (Sandbox Code Playgroud)
使用时strlen>1
我没有得到理想的回应(显然).
我怎么检查呢?
我需要保存一个结构:
struct {
uint16_t value;
uint16_t flag;
} status;
Run Code Online (Sandbox Code Playgroud)
使用外部 I2C EEPROM
HAL_StatusTypeDef HAL_I2C_Mem_Write (I2C_HandleTypeDef * hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t * pData, uint16_t Size, uint32_t Timeout)
Run Code Online (Sandbox Code Playgroud)
功能
你能建议我一个正确的方法来做到这一点吗?
我正在尝试将M95M02-DR 256KB EEPROM存储器芯片与MSP430微控制器连接.作为示例测试,我尝试将以下字符串写入其中:
第一章.兔子洞.爱丽丝开始厌倦了坐在银行的姐姐身边,
当我尝试从芯片中读取数据时,这就是我得到的:
第一章.兔子洞.爱丽丝开始厌倦了坐在姐姐身边的b ?????
?是垃圾数据.问题是,如果我将字符串的大小减少几个字符,那么就没有问题了.以前我曾尝试从SD卡上的文件中读取数据,并以256字节块写入EEPROM芯片.在这种情况下没有写任何东西.但是当我逐字节执行相同的操作时,没有问题.
这是我正在使用的代码
static uint32_t i=0x025698;
static unsigned char message[120] = "CHAPTER I. Down the Rabbit-Hole."\
"Alice was beginning to get very tired of sitting by her sister on the bank, ";
static int size ;
unsigned char input[120];
size = strlen(message);
eeprom_spi_init();
eeprom_write( i ,message,size);
__delay_cycles(2500);
eeprom_read( i, input,size);
input[size]='\0';
ax_log_msg(E_LOG_INFO,input); //print command
Run Code Online (Sandbox Code Playgroud)
低级SPI函数如下:
void eeprom_write(uint32_t ui_addr, uint8_t *puc_wrData, uint8_t ui_dataLen)
{
uint8_t uac_wrBuf[260] = {0x00,};
uint8_t i = 0;
EEPROM_wrEnable();
uac_wrBuf[i++] = …
Run Code Online (Sandbox Code Playgroud) 从我浏览的内容来看,一旦FPGA断电,您就必须对其进行编程。但是我正在尝试使用Verilog实现基于FPGA的安全系统。在这种情况下,我希望系统的密码被永久存储,即即使电源关闭也不应删除该密码。如果程序也可以存储也很好。我是FPGA的入门者。所以,请告诉我该怎么做。该设备是XC3S400 Spartan 3系列。
我习惯使用高级语言编程PC和智能手机,微控制器对我来说是一个新的领域.它们是不同的,更不值得信赖,需要不同的技术?这里有一些代码可以写入和读取运行在Arduino Mega上的EEPROM :(附加了以太网屏蔽,此处未使用)
#include <EEPROM.h>
int addr = 0;
int val;
byte value;
void setup()
{
Serial.begin(9600);
}
void loop()
{
val = 9;
EEPROM.write(addr, val);
delay(500);
addr = addr + 1;
if (addr == 20) addr = 0;
value = EEPROM.read(addr);
Serial.print(addr);
Serial.print("\t");
Serial.print(value);
Serial.println();
}
Run Code Online (Sandbox Code Playgroud)
下面是什么出来:
1 91
2 91
3 9
4 9
5 9
6 9
7 9
8 9
9 9
10 9
11 9
12 202
13 202
14 202
15 202
16 202 …
Run Code Online (Sandbox Code Playgroud) 我正在学习在 HAL 中编程,今天我想将一些数据保存到外部 I2C EEPROM。问题是我发送地址后无法让EEPROM发送ACK。我使用 Arduino(在 5V 和 3V 上)进行了尝试,IC 以 ACK 响应。我尝试连接一个 MLX90614 I2C IR 传感器,它工作正常(我得到了响应,我可以在 Arduino 和 STM32 中发送和接收数据)。我还交换了 SDA 和 SCL 引线,认为我可能将它们混合在一起,但事实并非如此。我使用了一个逻辑分析仪,正如你所看到的,我只得到了一个 NACK。我不认为 EEPROM IC (ATMLU036/2EB - AT24C256B) 不喜欢 3V,因为它在 Arduino 中工作,数据表说它即使在较低电压下也能正常工作。我不知道为什么它不工作以及为什么其他 I2C 外围设备(例如 IR 传感器)工作得很好。我正在使用 STM32F429ZI - DISC1。这是我的代码:(简而言之,我将 PB8 引脚用于 SCL,PB9 用于 SDA,我尝试了 100kHz、10kHz、1kHz scl 频率,但没有帮助。在 STM32CubeMX 中我没有改变任何东西 - 线路有内部拉力上电阻)
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f4xx_hal.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private variables ---------------------------------------------------------*/
I2C_HandleTypeDef hi2c1;
/* …
Run Code Online (Sandbox Code Playgroud) 我使用WinBond W25Q64JV SPI Flash芯片来存储数据,微控制器是STM32F101RCT6。当我尝试将数据存储在华邦芯片中时,它工作正常,我可以在华邦芯片中读取和写入数据,但如果我想覆盖同一地址中的新数据,它不会被覆盖,并且会提供旧数据新数据未写入同一内存中。如果我使用擦除选项,则会擦除所有地址位置中的所有数据,我无法擦除特定地址数据。删除所有地址数据后,我可以写入新数据,但我正在丢失所有其他位置的数据,因此请指导我覆盖同一地址位置中的新数据/特定地址的擦除选项,我的代码如下
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
Spi_data[0]=0x06; //Write Enable
HAL_SPI_Transmit(&hspi2,Spi_data,1,1000);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
Spi_data[0]=0x02; //Page Program
Spi_data[1]=0x00;
Spi_data[2]=0x10;
Spi_data[3]=0x14;
Spi_data[4]=0x43;
HAL_SPI_Transmit(&hspi2,Spi_data,5,10000);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
Spi_data[0]=0x03;//Read Data
Spi_data[1]=0x00;
Spi_data[2]=0x10;
Spi_data[3]=0x14;
HAL_SPI_Transmit(&hspi2,Spi_data,4,100);
HAL_SPI_Receive(&hspi2,GSdata,4,100);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
Run Code Online (Sandbox Code Playgroud)
当我尝试覆盖 0x1014 位置中的新数据时,如果我使用以下擦除选项,它不会被覆盖,它会擦除所有内存地址数据
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
Spi_data[0]=0x20;//Erase
Spi_data[1]=0x00;
Spi_data[2]=0x10;
Spi_data[3]=0x14;
HAL_SPI_Transmit(&hspi2,Spi_data,4,1000);
HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
Run Code Online (Sandbox Code Playgroud)
请指导我覆盖同一地址中的新数据/特定地址的擦除选项
我遇到的情况是我必须使用Python来读取和写入嵌入式设备上的EEPROM.第一页(256字节)用于非易失性数据存储.我的问题是变量的长度可能不同,我需要读取固定的数量.
例如,字符串存储在地址30处,并且可以是长度为6到10个字节的任何地方.我需要读取最大可能的长度,因为我不知道它的结束位置.它的作用是它给了我字符串中多余的垃圾.
data_str = ee_read(bytecount)
dbgmsg("Reading from EEPROM: addr = " + str(addr_low) + " value = " + str(data_str))
> Reading from EEPROM: addr = 30 value = h11c13????
Run Code Online (Sandbox Code Playgroud)
我对Python很新.有没有办法在读入后自动切断字符串中的数据?