I2C无法写入和读出寄存器值

之前不小心把自己做的通过6124B控制dms模组的功能的源码全给删掉了,可是吓死我了,没办法只能自己加班偷偷赶出来。

这次给我的教训就是所有的源码都应该留有备份,除非确认不需要的源码。

 

凭借着我的记忆,我其实已经把6124B的功能做出来了,只是因为I2C读写失败的问题导致一直接受不了dms的图像。我用的是我之前写的linux应用层的i2c设备文件的读写方式进行控制i2c接口的。一直以为是没有问题的。之所以写入和读取不成功是因为6124B的寄存器地址是8bit的,而我之前写的读写i2c的函数里面的地址是16bit的。这导致了i2c从设备一直不能正确获取到寄存器的地址。

 

解决:查看i2c的寄存器地址是8bit还是16bit。不同长度的地址会出现错误。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个示例代码,用于在 Keil uVision4 中学习 NRF24L01 芯片: ```c #include <reg51.h> #include <stdio.h> #include <string.h> #define BUFFER_SIZE 50 // 定义 NRF24L01 相关引脚 sbit CE = P1^0; sbit CSN = P1^1; sbit MOSI = P1^2; sbit MISO = P1^3; sbit SCK = P1^4; sbit IRQ = P1^5; // 定义 NRF24L01 寄存器地址 #define CONFIG 0x00 #define EN_AA 0x01 #define EN_RXADDR 0x02 #define SETUP_AW 0x03 #define SETUP_RETR 0x04 #define RF_CH 0x05 #define RF_SETUP 0x06 #define STATUS 0x07 #define OBSERVE_TX 0x08 #define RPD 0x09 #define RX_ADDR_P0 0x0A #define RX_ADDR_P1 0x0B #define RX_ADDR_P2 0x0C #define RX_ADDR_P3 0x0D #define RX_ADDR_P4 0x0E #define RX_ADDR_P5 0x0F #define TX_ADDR 0x10 #define RX_PW_P0 0x11 #define RX_PW_P1 0x12 #define RX_PW_P2 0x13 #define RX_PW_P3 0x14 #define RX_PW_P4 0x15 #define RX_PW_P5 0x16 #define FIFO_STATUS 0x17 unsigned char TX_Buffer[BUFFER_SIZE]; unsigned char RX_Buffer[BUFFER_SIZE]; unsigned char TX_Index = 0; unsigned char RX_Index = 0; // 定义串口通信相关函数 void UART_Init() { TMOD |= 0x20; // 设置定时器1为模式2 TH1 = 0xFD; // 设置波特率为9600bps SCON = 0x50; // 设置串口工作在模式1 TR1 = 1; // 启动定时器1 ES = 1; // 开启串口中断 EA = 1; // 开启总中断 // 开启 Printf 函数支持 SCON |= 0x40; // 设置串口工作在模式3 TI = 1; // 设置 TI 标志位为1,用于 Printf 函数的初始化 } void UART_Send(unsigned char dat) { SBUF = dat; // 将要发送的数据放入 SBUF 寄存器 while (!TI); // 等待数据发送完成 TI = 0; // 清除发送完成标志位 } void UART_Receive() interrupt 4 { if (RI) { RI = 0; // 清除接收中断标志位 RX_Buffer[RX_Index++] = SBUF; // 将接收到的数据放入接收缓冲区 if (RX_Index >= BUFFER_SIZE) { RX_Index = 0; // 接收缓冲区溢出,重置索引 } } } // 定义 OLED 相关函数 void OLED_Init() { // 初始化 OLED // ... } void OLED_SendCommand(unsigned char cmd) { // 发送命令给 OLED // ... } void OLED_SendData(unsigned char dat) { // 发送数据给 OLED // ... } // 定义 NRF24L01 相关函数 void NRF_WriteReg(unsigned char reg, unsigned char value) { CSN = 0; // 选中 NRF24L01 SPI_WriteByte(0x20 | reg); // 写寄存器地址 SPI_WriteByte(value); // 写寄存器 CSN = 1; // 取消选中 NRF24L01 } unsigned char NRF_ReadReg(unsigned char reg) { unsigned char value; CSN = 0; // 选中 NRF24L01 SPI_WriteByte(reg); // 读寄存器地址 value = SPI_ReadByte(); // 读寄存器 CSN = 1; // 取消选中 NRF24L01 return value; } // 定义芯片连接测试函数 void ChipConnectionTest() { unsigned char regValue; // 读取寄存器 regValue = NRF_ReadReg(CONFIG); // 将寄存器发送到串口或 OLED sprintf(TX_Buffer, "CONFIG Register Value: %02X\r\n", regValue); for (TX_Index = 0; TX_Index < strlen(TX_Buffer); TX_Index++) { UART_Send(TX_Buffer[TX_Index]); // 发送到串口 //OLED_SendData(TX_Buffer[TX_Index]); // 发送到 OLED } // 写入寄存器 NRF_WriteReg(CONFIG, 0x0F); // 读取写入后的寄存器 regValue = NRF_ReadReg(CONFIG); // 将寄存器发送到串口或 OLED sprintf(TX_Buffer, "CONFIG Register Value after Write: %02X\r\n", regValue); for (TX_Index = 0; TX_Index < strlen(TX_Buffer); TX_Index++) { UART_Send(TX_Buffer[TX_Index]); // 发送到串口 //OLED_SendData(TX_Buffer[TX_Index]); // 发送到 OLED } } // 定义 NRF24L01 发送函数 void NRF_SendData() { unsigned char VRX1_Value, VRY1_Value, VRX2_Value, VRY2_Value; unsigned char SW1_Value, SW2_Value, SW3_Value, SW4_Value, SW5_Value, SW6_Value, SW7_Value, SW8_Value; unsigned char dataToSend[12]; // 读取四路摇杆的 VRX1_Value = ADC_Read(0); VRY1_Value = ADC_Read(1); VRX2_Value = ADC_Read(2); VRY2_Value = ADC_Read(3); // 读取8个按键的 SW1_Value = SW1; SW2_Value = SW2; SW3_Value = SW3; SW4_Value = SW4; SW5_Value = SW5; SW6_Value = SW6; SW7_Value = SW7; SW8_Value = SW8; // 将数据存储到发送缓冲区 dataToSend[0] = VRX1_Value; dataToSend[1] = VRY1_Value; dataToSend[2] = VRX2_Value; dataToSend[3] = VRY2_Value; dataToSend[4] = SW1_Value; dataToSend[5] = SW2_Value; dataToSend[6] = SW3_Value; dataToSend[7] = SW4_Value; dataToSend[8] = SW5_Value; dataToSend[9] = SW6_Value; dataToSend[10] = SW7_Value; dataToSend[11] = SW8_Value; CSN = 0; // 选中 NRF24L01 SPI_WriteByte(0xA0); // 写数据到 TX FIFO for (int i = 0; i < 12; i++) { SPI_WriteByte(dataToSend[i]); // 逐个字节写入数据 } CSN = 1; // 取消选中 NRF24L01 } void main() { UART_Init(); // 初始化串口 OLED_Init(); // 初始化 OLED ChipConnectionTest(); // 执行芯片连接测试 while (1) { NRF_SendData(); // 发送数据 } } ``` 在这个示例代码中,我们使用 `NRF_WriteReg()` 函数和 `NRF_ReadReg()` 函数来写入和读取 NRF24L01 的寄存器。我们还定义了 `NRF_SendData()` 函数来读取四路摇杆的和8个按键的,并将它们存储到发送缓冲区中。然后,我们使用 SPI 接口将数据写入到 NRF24L01 的 TX FIFO 中。 你需要根据自己的实际情况来配置 NRF24L01 的引脚、SPI 接口,并根据需要选择使用串口或 OLED 来显示寄存器和发送数据的状态。如果使用串口,将相关代码取消注释;如果使用 OLED,将相关代码注释取消。 请确保你已正确设置了 Keil uVision4 的开发环境,并将 SPI 接口和 NRF24L01 连接到正确的引脚。同时,确保串口助手的波特率与代码中设置的波特率一致,或者 OLED 的初始化代码正确执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值