这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » Let'sdo2025第二期活动[智能手环DIY活动]驱动SSD1306

共1条 1/1 1 跳转至

Let'sdo2025第二期活动[智能手环DIY活动]驱动SSD1306

菜鸟
2025-10-03 10:56:54     打赏
驱动SSD1306

本次使用的SDD1306是我自己购买的,看见得捷的1306太贵了,然后拿自己顺手的SSD1306.

根据原理图我们定位一下其中I2C的位置

image-20251003103543954

软件配置

我们是基于I2C_SCAN来做扫描的

首先根据宏定义分析,我们的配置再下面,因为在项目中有俩个板卡的存在

image-20251003104922984

一般我们都要在makelife中修改我们的板卡类型

image-20251003104956951

其中主要配置,就是配置I2C和硬件的频率

image-20251003105108003

想实现I2C的通讯,就要先实现其中写函数的操作。

这里我是移植网上的SSD1306

static int SSD1306_Write(uint8_t control, uint8_t *data, uint16_t len)  
{  
   // 参数验证
   if (data == NULL && len > 0) {
       SSD1306_LOG("[SSD1306] Invalid parameter: data is NULL but len > 0\n");
       return -1;
   }
   
   // 长度检查,避免缓冲区溢出
   if (len > 255) { // I2C单次传输限制
       SSD1306_LOG("[SSD1306] Data length too large: %d\n", len);
       return -1;
   }
   
   mxc_i2c_req_t req = {0}; // 初始化为0,避免未初始化字段
   req.i2c = MXC_I2C1;
   req.addr = SSD1306_ADDR;
   req.rx_buf = NULL;
   req.rx_len = 0;
   req.restart = 0;
   req.callback = NULL;

   // 使用栈上缓冲区,避免动态分配
   uint8_t buffer[256]; // 最大支持255字节数据 + 1字节控制
   buffer[0] = control;
   
   // 只有当数据长度大于0时才复制数据
   if (len > 0) {
       memcpy(buffer + 1, data, len);
   }
   
   req.tx_buf = buffer;
   req.tx_len = len + 1;

   // 执行I2C传输
   int ret = MXC_I2C_MasterTransaction(&req);
   
   // 日志记录
   if (ret != 0) {
       SSD1306_LOG("[SSD1306] I2C Write failed: addr=0x%02X, control=0x%02X, len=%d, ret=%d\n",
                  SSD1306_ADDR, control, len, ret);
   } else {
       SSD1306_LOG("[SSD1306] I2C Write success: addr=0x%02X, control=0x%02X, len=%d\n",
                  SSD1306_ADDR, control, len);
   }
   
   // 根据传输结果调整延迟时间
   if (ret == 0) {
       // 成功时较短延迟
       MXC_Delay(MXC_DELAY_MSEC(1));
   } else {
       // 失败时较长延迟,给总线更多恢复时间
       MXC_Delay(MXC_DELAY_MSEC(10));
   }
   
   return ret;
}
 

通过AI帮我修改其中的函数

最后在main函数初始化进行操作,成功显示我们的fly的字母

int main(void)  
{  
 
   int res = MXC_I2C_Init(MXC_I2C1, 1, 0);  
   MXC_I2C_SetFrequency(MXC_I2C1, 400000);    
   SSD1306_Init();  
 
   SSD1306_Clear();  
 
   SSD1306_Print(0, 0, "Fly !");  
   while (1)  
   {  
   }  
 
   return 0;  
}  

image-20251003105552252




共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]