没接触过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); } } |
正在使用stm8作为从机与esp32进行i2c通讯,但是发现主机扫描的i2c地址与stm8从机设置的i2c地址不一样,请问如何解决?
STMS005K6T6 如何采集内部参考电压。
stm8s003 adc中断和通道切换的问题
IAR代码编辑太费劲了,想问一下有没有好的方法,试了VScode但是头文件老是报错,调了很久也没调好,想换个方法了。
想问一下各位大佬,IAR下载调试代码时出现 warning: is an illegal data sample expression IAR是什么意思啊?
stm8s批量烧录问题
IAR无法跳转定义,系统库文件文件名后有[RO]
STM8S标准库TIM1编码器功能不计数,请大师帮我看看
cosmic stm8 license网页申请按键没反应,可能是什么原因?
请问一下STM8S003F3P6,PB4和PB5做输入
但从代码上是看是很难看出来的,不知道你的速度,中间的延迟等信息。
所以对于I2C 通讯来说结合波形找问题是小伙伴们最常用的方法。
多谢大师,我知道了,
可能程序没问题,是一直循环读取,是读到的内容没变,,
这个从机的寄存器的问题,我猜它spdif信号没了寄存器信息不变,
请教,IAR在debug时,只要i2c读取操作能够一直循环不卡住,是不是可以说明读到的数据没问题?应该是从机的该寄存器数据没变吧?
软件没卡死只能大体上判断,或者说逻辑上大致正确,因为是否与硬件相应时序一致是不能判定的(比如说软件没有去检查关键信号)
所以还是要看I2C 波形,看看波形是否完整,从机是否有ACK信号。
看一下波形,注意I2C读取的时候,如果是只读一个,就不要回复ACK。