本次使用的SDD1306是我自己购买的,看见得捷的1306太贵了,然后拿自己顺手的SSD1306.
根据原理图我们定位一下其中I2C的位置
我们是基于I2C_SCAN来做扫描的
首先根据宏定义分析,我们的配置再下面,因为在项目中有俩个板卡的存在
一般我们都要在makelife中修改我们的板卡类型
其中主要配置,就是配置I2C和硬件的频率
想实现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;
}