大佬们求教!STC8H IIC 启动函数一直循环,无法正常使用
#include "stc8.h"#include "intrins.h"
#define I2CCFG (*(unsigned char volatile xdata *)0xfe80)
#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81)
#define I2CMSST (*(unsigned char volatile xdata *)0xfe82)
#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83)
#define I2CSLST (*(unsigned char volatile xdata *)0xfe84)
#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85)
#define I2CTXD (*(unsigned char volatile xdata *)0xfe86)
#define I2CRXD (*(unsigned char volatile xdata *)0xfe87)
sbit SDA = P1^4;
sbit SCL = P1^5;
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)
void Wait()
{
while (!(I2CMSST & 0x40));
I2CMSST &= ~0x40;
}
void Start()
{
I2CMSCR = 0x01; //发送START命令
Wait();
}
void SendData(char dat)
{
I2CTXD = dat; //写数据到数据缓冲区
I2CMSCR = 0x02; //发送SEND命令
Wait();
}
void RecvACK()
{
I2CMSCR = 0x03; //发送读ACK命令
Wait();
}
char RecvData()
{
I2CMSCR = 0x04; //发送RECV命令
Wait();
return I2CRXD;
}
void SendACK()
{
I2CMSST = 0x00; //设置ACK信号
I2CMSCR = 0x05; //发送ACK命令
Wait();
}
void SendNAK()
{
I2CMSST = 0x01; //设置NAK信号
I2CMSCR = 0x05; //发送ACK命令
Wait();
}
void Stop()
{
I2CMSCR = 0x06; //发送STOP命令
Wait();
}
void Delay()
{
int i;
for (i=0; i<3000; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void UartInit()
{
SCON = 0x5a;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x15;
}
void UartSend(char dat)
{
while (!TI);
TI = 0;
SBUF = dat;
}
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P_SW2 = 0x80;
I2CCFG = 0xe0; //使能I2C主机模式
I2CMSST = 0x00;
UartInit();
Start(); //发送起始命令------------------------------->这里注释掉就可以正常跑了
// SendData(0xa2); //发送设备地址+写命令
// RecvACK();
// SendData(0x02); //发送存储地址
// RecvACK();
// SendData(0x00); //设置秒值
// RecvACK();
// SendData(0x00); //设置分钟值
// RecvACK();
// SendData(0x12); //设置小时值
// RecvACK();
// Stop(); //发送停止命令
while (1)
{
UartSend(0xff);
// Start(); //发送起始命令
// SendData(0xa2); //发送设备地址+写命令
// RecvACK();
// SendData(0x02); //发送存储地址
// RecvACK();
// Start(); //发送起始命令
// SendData(0xa3); //发送设备地址+读命令
// RecvACK();
// P0 = RecvData(); //读取秒值
// SendACK();
// P2 = RecvData(); //读取分钟值
// SendACK();
// P3 = RecvData(); //读取小时值
// SendNAK();
// Stop(); //发送停止命令
// Delay();
}
}
大佬们,上面是我的代码,我的iic就是P14和P15,这个Start()函数一执行就一直在while (!(I2CMSST & 0x40));这里循环,不知道是啥问题,大佬们帮我看看吧{:4_184:}
大佬们帮我康康吧{:4_184:}{:4_184:}{:4_184:} 用上仿真来查卡在哪,而不是猜
仿真 STC8 系列 MCU,用 STC-USB Link1D ! 有视频讲解 - 仿真/ISP下载/做自己的ISP/编译器/头文件 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
神农鼎 发表于 2023-12-10 18:24
用上仿真来查卡在哪,而不是猜
大佬我能把我自己这个单片机烧成仿真再看嘛 神农鼎 发表于 2023-12-10 18:24
用上仿真来查卡在哪,而不是猜
大佬们,仿真里边的IIC在哪呀,为啥有SPI没看到IIC相关的寄存器😭 Rs428 发表于 2023-12-11 11:07
大佬们,仿真里边的IIC在哪呀,为啥有SPI没看到IIC相关的寄存器😭
用你的代码试了一下,没什么问题,只是增加了"stc8h.h"头文件
你使用附件例程试试
乘风飞扬 发表于 2023-12-11 11:19
用你的代码试了一下,没什么问题,只是增加了"stc8h.h"头文件
你使用附件例程试试
谢谢大佬,我去试试,我后面用中断查询的方法成功访问了IIC器件{:4_197:} I2C/SPI/串行口,我们组织了专门的 视频讲解
视频教学《USB型 1T 8051 单片机原理及应用-STC8H8K64U》,山东大学陈桂友教授 - 视频教学,《单片机原理及应用》教学改革及实践研讨会,实战技术交流会,会务通知 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
页:
[1]
2