81

主题

3

好友

1493

积分

侠之大者 当前在线

Rank: 6Rank: 6

UID
897598
帖子
1386
精华
0
经验
1493 点
金钱
1292 ¥
注册时间
2021-2-4
发表于 2023-10-31 14:22 | 显示全部楼层
本帖最后由 mchoi518 于 2023-11-1 08:35 编辑

看了坛子里的那个拥抱STM8的帖子,准备搞ES9038Q2M软控了,

能解码SPDIF就行,其他所有功能一概都不需要~

请大师帮我看看下面电路有无大问题,

1.JPG


最近51单片机学了几天基础,拥抱STM8帖子里的下面程序有几个地方看不懂,求教大师~

1. 去ST网站看了一下,没有库文件下载,只有网页上的程序代码,这些代码复制下来直接保存成.h文件就可以吗?
2. ST官网没有看到stm8s003f3p.h这个库,这个怎么搞哪位知道?
3. 第一行定义的stm8s003有什么用?下面程序中没看到引用
4. 我看了ES9038的文档,只看到音量默认-40db有问题,我只改了这一个寄存器,其他有无要设置的?



#define stm8s003
#include <stm8s.h>
#include <stm8s003f3p.h>
#include <stm8s_i2c.h>
#include <stm8s_clk.h>
#include <stm8s_gpio.h>

#define ES9038Q2M 0x90

void delay_100ms(void)
{
  unsigned char i,j;

  for(i=0;i<255;i++)//2*255个指令周期

    for(j=0;j<255;j++);//2*255个指令周期

}

void Mute_release(void)
{
  //PD_ODR_ODR3 = 1;
  PD_ODR = 0xFF;

}

uint8_t I2C_Write(uint8_t address,uint8_t data)

{
        while(I2C_GetFlagStatus( I2C_FLAG_BUSBUSY));
  
        I2C_GenerateSTART( ENABLE);//开启I2C1  
        while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/  
  
        I2C_Send7bitAddress(ES9038Q2M, I2C_DIRECTION_TX );//器件地址 -- 默认0x90  
        while(!I2C_CheckEvent( I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));  
  
        I2C_SendData(address);//寄存器地址  
        while (!I2C_CheckEvent( I2C_EVENT_MASTER_BYTE_TRANSMITTED));  
  
        I2C_SendData(data);//发送数据  
        while (!I2C_CheckEvent( I2C_EVENT_MASTER_BYTE_TRANSMITTED));  
        I2C_AcknowledgeConfig(ENABLE);  
  
        I2C_GenerateSTOP( ENABLE);//关闭I2C1总线
}

void Sys_Init(void)
{
        CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
        I2C_Cmd(DISABLE);
        GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_OD_LOW_FAST);
        I2C_Init(100000, 0xA0, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 0x08);
        I2C_Cmd(ENABLE);

}

int main( void )
{
        Sys_Init();

        delay_100ms();
        delay_100ms();
        delay_100ms();
        delay_100ms();
        delay_100ms();
   I2C_Write(0x0F,0x00);//音量最大
   I2C_Write(0x10,0x00);//音量最大
        delay_100ms();
  Mute_release();
while(1);
}

#ifdef USE_FULL_ASSERT  
void assert_failed(u8* file, u32 line)  
{  
  while (1)  
  {  
  }  
}  
#endif

66

主题

44

好友

1万

积分
     

贵宾 当前离线

Rank: 3Rank: 3

UID
111707
帖子
12391
精华
3
经验
12802 点
金钱
12262 ¥
注册时间
2009-6-14

社区贡献 论坛贵宾

发表于 2023-10-31 14:30 来自手机端 | 显示全部楼层
没用,只有代码没有库文件。 相当于没得底层驱动只有逻辑操作

81

主题

3

好友

1493

积分

侠之大者 当前在线

Rank: 6Rank: 6

UID
897598
帖子
1386
精华
0
经验
1493 点
金钱
1292 ¥
注册时间
2021-2-4
 楼主| 发表于 2023-10-31 14:51 | 显示全部楼层
jacksl528 发表于 2023-10-31 14:30
没用,只有代码没有库文件。 相当于没得底层驱动只有逻辑操作

多谢大师,

您说的没用,是指这段代码根本无法运行?

7

主题

3

好友

554

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
793062
帖子
549
精华
0
经验
554 点
金钱
529 ¥
注册时间
2015-5-23
发表于 2023-10-31 15:07 | 显示全部楼层
注意,9038Q2M复位电平过后,芯片寄存器不会自动加载默认设置,需要初始化。要给所有寄存器都赋上需要的值。

81

主题

3

好友

1493

积分

侠之大者 当前在线

Rank: 6Rank: 6

UID
897598
帖子
1386
精华
0
经验
1493 点
金钱
1292 ¥
注册时间
2021-2-4
 楼主| 发表于 2023-10-31 15:28 | 显示全部楼层
xdming 发表于 2023-10-31 15:07
注意,9038Q2M复位电平过后,芯片寄存器不会自动加载默认设置,需要初始化。要给所有寄存器都赋上需要的值 ...

多谢大师~ 那么9038几十个寄存器我都得定义一遍?

7

主题

3

好友

554

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
793062
帖子
549
精华
0
经验
554 点
金钱
529 ¥
注册时间
2015-5-23
发表于 2023-10-31 20:01 | 显示全部楼层
本帖最后由 xdming 于 2023-10-31 20:12 编辑

对的,建立一个数组,开机初始化,复位脉冲过后,对所有寄存器写一遍。
1698754226746.png

81

主题

3

好友

1493

积分

侠之大者 当前在线

Rank: 6Rank: 6

UID
897598
帖子
1386
精华
0
经验
1493 点
金钱
1292 ¥
注册时间
2021-2-4
 楼主| 发表于 2023-11-1 08:55 | 显示全部楼层
本帖最后由 mchoi518 于 2023-11-1 09:03 编辑
xdming 发表于 2023-10-31 20:01
对的,建立一个数组,开机初始化,复位脉冲过后,对所有寄存器写一遍。


多谢大师,,我是新手,您这段代码上段不知道怎么写啊,

就我顶楼的那段代码请教几个基础问题,有空的时候帮我看看~

1)  GPIO就是PD吗?GPIO init就是所有PD脚的初始化吗?
2)main里面第一步通过sys_init把PD3拉低,然后通过mute_release再拉高所有脚是吗?这个就是复位脉冲?
3)es9018硬控为例,reset脚10k拉高并联1uf电容,是为了其他上电后reset脚最后变高电平并且复位,这时所有寄存器会加载默认设置。
按您说的9038q2m复位后不会自动加载,,这个是因为通电复位后再次用复位脉冲时才出现? 还是说9038不管是开机通电复位还是复位脉冲都能清空所有寄存器?
4)如果只有复位脉冲后无法自动加载默认值,那么我是不是可以改一下程序去掉reset脚复位脉冲就可以了?
5)用i2c write语句写个别寄存器,不影响其他寄存器吧?那么我把程序里延迟改高一点,在上电自动复位结束后把需要更改的个别寄存器修改了就可以了?
6)请问stm8s103在没有特别设置时,PD脚都是高电平吗?
7)我想用i2c 读取解码芯片里的spdif锁定状态值,然后赋予一个PD脚低电平,代码怎么写?这个是不是应该做成定时任务一直循环读取?
8)如果不用一直开启mcu,我想让mcu休眠,代码怎么写?

49

主题

3

好友

1444

积分

贵宾 当前离线

Rank: 3Rank: 3

UID
2043
帖子
1242
精华
4
经验
1444 点
金钱
1150 ¥
注册时间
2004-11-5

论坛贵宾 DIY大赛获奖

发表于 2023-11-1 09:24 | 显示全部楼层
如果初学单片机,先调通I2C,熟悉51就用51

7

主题

3

好友

554

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
793062
帖子
549
精华
0
经验
554 点
金钱
529 ¥
注册时间
2015-5-23
发表于 2023-11-1 09:25 | 显示全部楼层
本帖最后由 xdming 于 2023-11-1 09:47 编辑
mchoi518 发表于 2023-11-1 08:55
多谢大师,,我是新手,您这段代码上段不知道怎么写啊,

就我顶楼的那段代码请教几个基础问题,有空 ...


1、 GPIO int这些东西,是你贴出来的代码。用什么单片机,就写什么代码,引脚怎么接就怎么定义单片机和么函数,这些都是很灵活的,没必要照本宣科。我以前没用过STM的单片机,以后也不打算用,所以那个代码我没看,我也没必要去看。
2、我的代码是用在STC89C52单片机上了,原理是一样的,定义了某一个IO脚位rst开机就给拉低,置位IIC总线后再拉高。这是一个给ES9038Q2M的复位电平。
3、对于ES9038Q2M这个芯片,当时我是调到能工作就没继续深入研究了。至于通电后二次复位会不会继续清空所有寄存器,我也不清楚,没试过。你可以自己试试。其实也没必要纠结这些,如果会清空寄存器,就每次复位电平过后重新初始化一下芯片就好。将代码写成一个函数,每次复位调用一次就可以了,也不耗研发时间,解码芯片只需要几毫秒的时间就能完成初始化,没必要纠结。
4、复位脉冲过后,无法自动加载默认设置,我是开机通电的第一次测试出来的,后续二次复位是不是这个情况真不清楚。就像第3点说的,没必要纠结这些,程序调通了,芯片正常工作后,它就在你的掌握之下,你爱怎么弄就怎么弄。
5、I2C写解码芯片的寄存器,是要指定写入寄存地址的。不会影响其它寄存器。你能问出这样的问题,那么就给你一个忠告:你不需要关心会不会影响其它寄存器,而是需要理解I2C总线的工作原理、读写过程、用代码控制单片机IO脚模拟I2C总线通信、单片机自带硬件I2C总线接口的代码及使用方法。
6、重复一次,我没用过STM8S103这个单片机,以后也不打算用。就控制一下音响l类的芯片,对我来说国产STC8G系列51单片机就足够用了,因为用熟手了,而且它便宜、工作稳定、供货稳定、使用简单,没必要浪费时间研究用其它芯片。
7、代码怎么写,你自己研究一下,我不可能帮你把代码写出来,不然就是要收费了,而且不便宜哦。最多就贴出我以前的代码给你参考一下。其实就是在主函数里面的大循环反复定时调用读取函数,满足条件后进行一些列的操作。这个要你自己去做。
8、单片机休眠,每款单片机都不一样,怎么让单片机休眠要,你自己看看手册。什么都告诉你,代码都给你写出来,是需要付费的哦。

81

主题

3

好友

1493

积分

侠之大者 当前在线

Rank: 6Rank: 6

UID
897598
帖子
1386
精华
0
经验
1493 点
金钱
1292 ¥
注册时间
2021-2-4
 楼主| 发表于 2023-11-1 09:38 | 显示全部楼层
cdream 发表于 2023-11-1 09:24
如果初学单片机,先调通I2C,熟悉51就用51

多谢大师,,主要是51我也没学几天,一知半解,51单片机手里只有一个学习用的STC15F104W,51的i2c查了一下软件写代码太长了~ 确实如您所说这个先调通i2c就是个大活~
所以想投机取巧搞个带I2C功能的单片机试试先~

81

主题

3

好友

1493

积分

侠之大者 当前在线

Rank: 6Rank: 6

UID
897598
帖子
1386
精华
0
经验
1493 点
金钱
1292 ¥
注册时间
2021-2-4
 楼主| 发表于 2023-11-1 09:38 | 显示全部楼层
xdming 发表于 2023-11-1 09:25
1、 GPIO int这些东西,是你贴出来的代码。用什么单片机,就写什么代码,引脚怎么接就怎么定义单片机和么 ...

多谢大师,原来您用的是51单片机,STC89C52这个芯片含i2c硬件吗?

1

主题

0

好友

5

积分

注册会员 当前离线

Rank: 2

UID
937610
帖子
4
精华
0
经验
5 点
金钱
3 ¥
注册时间
2021-12-16
发表于 2023-11-1 09:42 | 显示全部楼层
你要先确保硬件电路没问题才行。然后就是软件部分
先能编译下载——点灯——I2C读得出数据——写寄存器——读寄存器
1. 去ST网站看了一下,没有库文件下载,只有网页上的程序代码,这些代码复制下来直接保存成.h文件就可以吗?
官网要进这个才有文件:https://www.stmcu.org.cn/     ,直接保存应该没用
2. ST官网没有看到stm8s003f3p.h这个库,这个怎么搞哪位知道?
如上
3. 第一行定义的stm8s003有什么用?下面程序中没看到引用
没啥意义
4. 我看了ES9038的文档,只看到音量默认-40db有问题,我只改了这一个寄存器,其他有无要设置的?
参考规格书设置或者其他人的寄存器设置看看

7

主题

3

好友

554

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
793062
帖子
549
精华
0
经验
554 点
金钱
529 ¥
注册时间
2015-5-23
发表于 2023-11-1 09:48 | 显示全部楼层
mchoi518 发表于 2023-11-1 09:38
多谢大师,原来您用的是51单片机,STC89C52这个芯片含i2c硬件吗?

不含,用代码模拟的。

81

主题

3

好友

1493

积分

侠之大者 当前在线

Rank: 6Rank: 6

UID
897598
帖子
1386
精华
0
经验
1493 点
金钱
1292 ¥
注册时间
2021-2-4
 楼主| 发表于 2023-11-1 10:02 | 显示全部楼层
hz805568 发表于 2023-11-1 09:42
你要先确保硬件电路没问题才行。然后就是软件部分
先能编译下载——点灯——I2C读得出数据——写寄存器— ...

多谢大师!!!

等周末零件到了板子焊好我再慢慢研究,另外库文件昨天在一个tb商家那里要了一堆,也不知道好不好用~回头我再看看您推荐的网站~
1)您说的点灯啥意思?我拍了一个ST LINK下载器了,您是说这东西上面的灯吗?
2)I2C写寄存器之前需要先读从机的数据吗,您说的是先测试I2C连接的意思?用读取寄存器语句读出来后,我如何能看到读取结果?在keil或者IAR上能看到结果吗?

81

主题

3

好友

1493

积分

侠之大者 当前在线

Rank: 6Rank: 6

UID
897598
帖子
1386
精华
0
经验
1493 点
金钱
1292 ¥
注册时间
2021-2-4
 楼主| 发表于 2023-11-1 10:03 | 显示全部楼层
xdming 发表于 2023-11-1 09:48
不含,用代码模拟的。

佩服~

请教大师大多数人是用软件模拟I2C还是硬件I2C呢?

1

主题

0

好友

5

积分

注册会员 当前离线

Rank: 2

UID
937610
帖子
4
精华
0
经验
5 点
金钱
3 ¥
注册时间
2021-12-16
发表于 2023-11-1 10:11 | 显示全部楼层
mchoi518 发表于 2023-11-1 10:02
多谢大师!!!

等周末零件到了板子焊好我再慢慢研究,另外库文件昨天在一个tb商家那里要 ...

1、点灯就是看STM8S单片机控制端口看对不对,一般接个LED灯验证
2、对,先读再写就是测试I2C连接有无问题或者程序有无问题,可以设置变量然后观察变量,参考这个:
https://juejin.cn/post/6979369732658954248

7

主题

3

好友

554

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
793062
帖子
549
精华
0
经验
554 点
金钱
529 ¥
注册时间
2015-5-23
发表于 2023-11-1 10:23 | 显示全部楼层
mchoi518 发表于 2023-11-1 10:03
佩服~

请教大师大多数人是用软件模拟I2C还是硬件I2C呢?

能用硬件I2C接口的就尽量用硬件的,因为它简单方便代码少。但是用代码模拟也是必须掌握的,这个过程能帮你理解通透I2C总线的通讯过程。

81

主题

3

好友

1493

积分

侠之大者 当前在线

Rank: 6Rank: 6

UID
897598
帖子
1386
精华
0
经验
1493 点
金钱
1292 ¥
注册时间
2021-2-4
 楼主| 发表于 2023-11-1 11:33 | 显示全部楼层
hz805568 发表于 2023-11-1 10:11
1、点灯就是看STM8S单片机控制端口看对不对,一般接个LED灯验证
2、对,先读再写就是测试I2C连接有无问 ...

多谢大师~~ 我先学习学习您给的网址~

81

主题

3

好友

1493

积分

侠之大者 当前在线

Rank: 6Rank: 6

UID
897598
帖子
1386
精华
0
经验
1493 点
金钱
1292 ¥
注册时间
2021-2-4
 楼主| 发表于 2023-11-1 11:35 | 显示全部楼层
xdming 发表于 2023-11-1 10:23
能用硬件I2C接口的就尽量用硬件的,因为它简单方便代码少。但是用代码模拟也是必须掌握的,这个过程能帮 ...

多谢大师~ 再请教一下ES9038Q2M的12脚和27脚都是同样的VCCA,芯片没到手正在画板子,请问这俩脚是通的吗?是不是我任意接一个就可以?不用两个都接电源吧?

7

主题

3

好友

554

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
793062
帖子
549
精华
0
经验
554 点
金钱
529 ¥
注册时间
2015-5-23
发表于 2023-11-1 12:03 | 显示全部楼层
没试过,这两只脚我是全接了3.3V数字供电,芯片工作正常。至于只接其中一只脚行不行,我推测是不行的。你可以试试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc.

返回顶部