![shequ.stmicroelectronics.cn](./template/st_v1/static/img/logo2.png)
没接触过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); } } |
各位前辈,请教stm8s003f3p6 swim需不需要上拉?
请教 stm8s 复位电路 和VCAP电容问题
项目完成,请各位前辈指点
关于STM8S IAR写程序内存的问题
推挽输出的电压
请教STM8S003F3P6 eeprom和真开漏输出
STM8S003F3U6 请求各位大佬支援,但是遇到如下问题。。。这样就一定是这颗芯片的问题吗?
各位大佬帮忙看看 STM8S003F3U6TR 哪里使用错误了?
如何搭建环境?
新手,STM8S标准库外部中断方式连接EC11的问题
但从代码上是看是很难看出来的,不知道你的速度,中间的延迟等信息。
所以对于I2C 通讯来说结合波形找问题是小伙伴们最常用的方法。
多谢大师,我知道了,
可能程序没问题,是一直循环读取,是读到的内容没变,,
这个从机的寄存器的问题,我猜它spdif信号没了寄存器信息不变,
请教,IAR在debug时,只要i2c读取操作能够一直循环不卡住,是不是可以说明读到的数据没问题?应该是从机的该寄存器数据没变吧?
软件没卡死只能大体上判断,或者说逻辑上大致正确,因为是否与硬件相应时序一致是不能判定的(比如说软件没有去检查关键信号)
所以还是要看I2C 波形,看看波形是否完整,从机是否有ACK信号。
看一下波形,注意I2C读取的时候,如果是只读一个,就不要回复ACK。