- 打卡等级:偶尔看看III
- 打卡总天数:58
- 最近打卡:2025-03-14 12:08:00
已绑定手机
中级会员
- 积分
- 277
|
书接上回
求助帖—如何使用擎天柱AI8051最小系统板驱动iic0.96OLED屏幕 - OLED12864,DMA-SPI/I2C 自动刷屏,GUI/U8g2,科学计算器,红外遥控 国芯技术交流网站 - AI32位8051交流社区
之后学习了I2C通信协议,想做一个应答实验,
初始化I2C-起始-发送从机地址-接收应答并分析-指定led灯亮灭
但是不能达到效果,想不通为啥应答信号总是高电平
屏幕芯片是1315,***从机地址为0x78(不确定)***,
芯片为擎天柱AI8051u
因为目的是20届智能车竞赛,使用逐飞开源库
以下是代码,随后附上源代码
#include "zf_common_headfile.h"
#define MyI2C_SCL IO_P21
#define MyI2C_SDA IO_P20
uint8 Ack;
void MyI2C_W_SCL(uint8 Bitvalue)
{
gpio_set_level(MyI2C_SCL,Bitvalue);
system_delay_us(10);
}
void MyI2C_W_SDA(uint8 Bitvalue)
{
gpio_set_level(MyI2C_SDA,Bitvalue);
system_delay_us(10);
}
uint8 MyI2C_R_SDA(void)
{
uint8 Bitvalue;
Bitvalue = gpio_get_level(MyI2C_SDA);
return Bitvalue;
}
void MyI2C_Init(void)
{
system_delay_us(200);
gpio_init(MyI2C_SDA, GPO, 1, GPO_OPEN_DTAIN);
gpio_init(MyI2C_SCL, GPO, 1, GPO_OPEN_DTAIN);
}
void MyI2C_Start(void)
{
MyI2C_W_SDA(1);
MyI2C_W_SCL(1);
MyI2C_W_SDA(0);
MyI2C_W_SCL(0);
}
void MyI2C_Stop(void)
{
MyI2C_W_SDA(0);
MyI2C_W_SCL(1);
MyI2C_W_SDA(1);
}
void MyI2C_SendByte(uint8 Byte)
{
uint8 i;
for(i= 0;i<8;i++)
{
if(Byte & (0x80 >> i) == 0) MyI2C_W_SDA(0);
else MyI2C_W_SDA(1);
MyI2C_W_SCL(1);
MyI2C_W_SCL(0);
}
}
uint8 MyI2C_ReceiveByte(void)
{
uint8 i,Byte = 0x00;
MyI2C_W_SDA(1);
for(i = 0; i<8 ; i++)
{
MyI2C_W_SCL(1);
if(MyI2C_R_SDA() == 1) {Byte |= (0x80 >> i);}
MyI2C_W_SCL(0);
}
return Byte;
}
void MyI2C_SendAck(uint8 AckBit)
{
MyI2C_W_SDA(AckBit);
MyI2C_W_SCL(1);
MyI2C_W_SCL(0);
}
uint8 MyI2C_ReceiveAck(void)
{
uint8 AckBit;
MyI2C_W_SDA(1);
MyI2C_W_SCL(1);
AckBit = MyI2C_R_SDA();
MyI2C_W_SCL(0);
return AckBit;
}
void main()
{
clock_init(SYSTEM_CLOCK_40M); // 务必保留
debug_init(); // 务必保留
// 此处编写用户代码 例如外设初始化代码等
MyI2C_Init();
MyI2C_Start();
MyI2C_SendByte(0x78);
Ack = MyI2C_ReceiveAck();
MyI2C_Stop();
if(Ack == 0)
{
gpio_set_level(IO_P24,0);
}
else if(Ack == 1)
{
gpio_set_level(IO_P25,0);
}
else
{
gpio_set_level(IO_P26,0);
}
while(1)
{
// 此处编写需要循环执行的代码
}
}
接线及实验现象
接线及实验现象
|
|