你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

新手求教,STM8S103如何用硬件I2C定时重复读取从机的一个状态寄存器?

[复制链接]
mchoi 提问时间:2023-11-8 09:45 / 未解决

没接触过MCU,为了解码器制作苦学了几天STM8单片机I2C,网上查了很多资料,现在通过硬件I2C可以读写从机了,

写可以写很多寄存器,但是读只能读一个寄存器,连续读多个寄存器会卡死在读取函数第1步,这个倒不是关键,

关键问题是:我想一直重复读取音频解码芯片的SPDIF状态寄存器,根据状态控制亮灯灭灯,启动时可以正确点亮,debug时程序可以一直循环不报错,但是从机寄存器状态变了,灯不灭! 请大师帮我看看程序怎么改~~

void I2C_Read(uint8_t address)

{

while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));

I2C_GenerateSTART(ENABLE);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(DAC_ADDRESS, I2C_DIRECTION_TX);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

I2C_SendData(address);

while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_GenerateSTART(ENABLE);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(DAC_ADDRESS, I2C_DIRECTION_RX);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));

SPDIF_STATUS = I2C_ReceiveData();

I2C_AcknowledgeConfig(I2C_ACK_CURR);

I2C_GenerateSTOP(ENABLE);

}

void main(void)

{

MCU_Init();

DAC_Init();

I2C_Write(0x00,0x04);

I2C_Write(0x0E,0x4C);

I2C_Write(0x0F,0x00);

I2C_Write(0x10,0x00);

while (1)

{

I2C_Read(0x60);

if(SPDIF_STATUS==0x34)

GPIO_WriteLow(GPIOD, (GPIO_Pin_TypeDef)GPIO_PIN_3);

else

GPIO_WriteHigh(GPIOD, (GPIO_Pin_TypeDef)GPIO_PIN_3);

Delay(0xFFFF);

}

}

收藏 评论5 发布时间:2023-11-8 09:45

举报

5个回答
butterflyspring 回答时间:2023-11-8 14:53:24
建议你量测一下波形,看看I2C总线上的信号是否是期望的,或者有什么异常,这样更有利于判断。

但从代码上是看是很难看出来的,不知道你的速度,中间的延迟等信息。

所以对于I2C 通讯来说结合波形找问题是小伙伴们最常用的方法。
mchoi 回答时间:2023-11-8 19:41:28

butterflyspring 发表于 2023-11-8 14:53
建议你量测一下波形,看看I2C总线上的信号是否是期望的,或者有什么异常,这样更有利于判断。</p>
<p>但从代码上 ...

多谢大师,我知道了,

可能程序没问题,是一直循环读取,是读到的内容没变,,

这个从机的寄存器的问题,我猜它spdif信号没了寄存器信息不变,

请教,IAR在debug时,只要i2c读取操作能够一直循环不卡住,是不是可以说明读到的数据没问题?应该是从机的该寄存器数据没变吧?

butterflyspring 回答时间:2023-11-9 14:30:55
mchoi 发表于 2023-11-8 19:41
[md]多谢大师,我知道了,

可能程序没问题,是一直循环读取,是读到的内容没变,,

软件没卡死只能大体上判断,或者说逻辑上大致正确,因为是否与硬件相应时序一致是不能判定的(比如说软件没有去检查关键信号)

所以还是要看I2C 波形,看看波形是否完整,从机是否有ACK信号。
废鱼 回答时间:2023-11-9 20:32:31

看一下波形,注意I2C读取的时候,如果是只读一个,就不要回复ACK。

xmshao 回答时间:2023-12-27 10:47:39
我认为你如果没有贴出从机端相关访问时序,别人很难根据现有信息做出判断。从你给出的主机端的代码来看,似乎没啥问题。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版