OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4565|回复: 6

XFS5152语音合成播报模块的IIC通讯与正点原子的LCD屏冲突

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2022-3-31
在线时间
5 小时
发表于 2022-4-13 01:46:57 | 显示全部楼层 |阅读模式
7金钱
语音模块使用的是亚博智能的XFS5152芯片TTS开发版,以硬件IIC的方式与f103战舰开发版的PB6、PB7口连接,LCD用的是正点原子的4.3寸TFTLCD。
现在的情况为:两个模块分别运行均为正常,但是在一个项目里同时用语音播报和LCD显示时,主程序就会在调用语音模块例程的每个函数处卡死。

下面是主程序中开头一段:

故障项目主程序

故障项目主程序

为了简洁,所有的初始化函数都放到了init_all()函数里,这里面就包含正点的LCD_init()函数;

故障情形:
1、当仅执行I2C_Bus_Init()后调用语音模块的函数能正常读出"开始测量",这里的第41行到第43行均为语音模块例程中的函数;
2、执行了init_all()后,即LCD_init()后,就算重新初始化I2C总线,程序也会在底47行卡死,进入死循环,注释掉第47行就会在第48行卡死,同第49行。

备注:
为了排除可能为除了LCD的其他模块的问题,在init_all函数中单独注释掉LCD_init(),语音播报函数可以正常运行下去,当然屏幕不会亮。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2022-3-31
在线时间
5 小时
 楼主| 发表于 2022-4-13 07:32:18 | 显示全部楼层
下面是实现硬件IIC的语音模块例程中的.c文件

  1. #include "bsp_i2c.h"
  2. #include "usart.h"          
  3. /* 这个地址只要与STM32外挂的I2C器件地址不一样即可 */
  4. #define I2Cx_OWN_ADDRESS7      0XF999

  5. /* STM32 I2C 快速模式 */
  6. #define I2C_Speed              100000
  7. static __IO uint32_t  I2CTimeout = I2CT_LONG_TIMEOUT;


  8. static void Delay_( u8 i)
  9. {     
  10.     while( i--)
  11.        {       

  12.         }
  13. }       

  14. void delay(unsigned long uldata)
  15. {
  16.         u8 j  =  0;
  17.         unsigned int g  =  0;
  18.         for (j=0;j<5;j++)
  19.         {
  20.                 for (g=0;g<uldata;g++)
  21.                 {
  22.       Delay_(120);
  23.                 }
  24.         }
  25. }



  26. static void I2C_GPIO_Config(void)
  27. {
  28.   GPIO_InitTypeDef  GPIO_InitStructure;

  29.         /* 使能与 I2C1 有关的时钟 */
  30.         RCC_APB1PeriphClockCmd ( RCC_APB1Periph_I2C1, ENABLE );
  31.         RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOB, ENABLE );
  32.        
  33.    
  34.   /* PB6-I2C1_SCL、PB7-I2C1_SDA*/
  35.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  36.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  37.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;               // 开漏输出
  38.   GPIO_Init(GPIOG, &GPIO_InitStructure);
  39.        
  40.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  41.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  42.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;               // 开漏输出
  43.   GPIO_Init(GPIOG, &GPIO_InitStructure);               
  44.        
  45.        
  46.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
  47.        
  48. }

  49. static void I2C_Mode_Configu(void)
  50. {
  51.        
  52.   I2C_InitTypeDef  I2C_InitStructure;
  53.         I2C_DeInit(I2C1);//使用I2C1       

  54.   /* I2C 配置 */
  55.   I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  56.        
  57.         /* 高电平数据稳定,低电平数据变化 SCL 时钟线的占空比 */
  58.   I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  59.        
  60.   I2C_InitStructure.I2C_OwnAddress1 =I2Cx_OWN_ADDRESS7;
  61.   I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;
  62.        
  63.         /* I2C的寻址模式 */
  64.   I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  65.        
  66.         /* 通信速率 */
  67.   I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
  68.   
  69.         /* I2C1 初始化 */
  70.   I2C_Init(I2C1, &I2C_InitStructure);
  71.   
  72.         /* 使能 I2C1 */
  73.   I2C_Cmd(I2C1, ENABLE);   

  74. }

  75. void I2C_Bus_Init(void)
  76. {
  77.   I2C_GPIO_Config();

  78.   I2C_Mode_Configu();

  79. }

  80. /**
  81.   * @brief  Basic management of the timeout situation.
  82.   * [url=home.php?mod=space&uid=271674]@param[/url]  None.
  83.   * @retval None.
  84.   */
  85. static  uint8_t I2C_TIMEOUT_UserCallback(void)
  86. {
  87.   /* Block communication and all processes */
  88.   //MPU_ERROR("I2C Timeout error!");
  89.   
  90.   return 0;
  91. }



  92. /**
  93.   * @brief   写一个字节到I2C设备中
  94.   * @param   
  95.   *                @arg pBuffer:写的值
  96.   * @retval  正常返回1,异常返回0
  97.   */
  98. uint8_t I2C_ByteWrite(u8 pBuffer)
  99. {
  100.         I2CTimeout = I2CT_FLAG_TIMEOUT;
  101.         while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY))
  102.         {
  103.                 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
  104.         }
  105.        
  106.   /* Send STRAT condition */
  107.   I2C_GenerateSTART(I2C1, ENABLE);
  108.        
  109.         I2CTimeout = I2CT_FLAG_TIMEOUT;


  110.   /* Test on EV5 and clear it */
  111.   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
  112.   {
  113.     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
  114.   }

  115.   /* Send slave address for write */
  116.   I2C_Send7bitAddress(I2C1, I2C_ADDR, I2C_Direction_Transmitter);
  117.   
  118.         I2CTimeout = I2CT_FLAG_TIMEOUT;
  119.   /* Test on EV6 and clear it */
  120.   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  121.         {
  122.     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
  123.   }  
  124.       

  125.   /* Send the byte to be written */
  126.   I2C_SendData(I2C1, pBuffer);
  127.        
  128.         I2CTimeout = I2CT_FLAG_TIMEOUT;
  129.    
  130.   /* Test on EV8 and clear it */
  131.   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))       
  132.         {
  133.     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
  134.   }        
  135.         delay(200);
  136.   /* Send STOP condition */
  137.   I2C_GenerateSTOP(I2C1, ENABLE);
  138.         delay(200);
  139.         return 1; //正常返回1
  140. }


  141. void I2C_Writes_Bytes(u8 *buff,int number)
  142. {
  143.         int i;
  144.         for(i = 0;i < number;i++)
  145.         {
  146.                 I2C_ByteWrite(buff[i]);
  147.         }
  148. }



  149. /**
  150.   * @brief   获取芯片状态值
  151.   * @param   
  152.   * @retval  返回状态值
  153.   */
  154. u8 GetChipStatus(void)
  155. {  
  156.         u16 NumByteToRead = 1;
  157.         u8 pBuffer = 0xff;
  158.   u8 AskState[4] = {0xFD,0x00,0x01,0x21};
  159.        
  160.         I2C_Writes_Bytes(AskState,4);
  161.                        
  162.                 delay(350);
  163.   /* Send STRAT condition a second time */  
  164.   I2C_GenerateSTART(I2C1, ENABLE);
  165.   
  166.         I2CTimeout = I2CT_FLAG_TIMEOUT;
  167.   /* Test on EV5 and clear it */
  168.   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
  169.         {
  170.     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
  171.   }
  172.                
  173.   /* Send slave address for read */
  174.   I2C_Send7bitAddress(I2C1, I2C_ADDR, I2C_Direction_Receiver);
  175.   
  176.         I2CTimeout = I2CT_FLAG_TIMEOUT;
  177.          
  178.   /* Test on EV6 and clear it */
  179.   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
  180.         {
  181.     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();
  182.   }


  183.   /* While there is data to be read */
  184.   while(NumByteToRead)  
  185.   {
  186.     if(NumByteToRead == 1)
  187.     {
  188.               /* Disable Acknowledgement */
  189.       I2C_AcknowledgeConfig(I2C1, DISABLE);
  190.        
  191.         /* Send STOP Condition */
  192.                         I2C_GenerateSTOP(I2C1, ENABLE);       
  193.     }

  194.     /* Test on EV7 and clear it */
  195.     if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))  
  196.     {      
  197.                        
  198.       /* Read a byte from the slave */
  199.       pBuffer = I2C_ReceiveData(I2C1);
  200.      
  201.       /* Decrement the read bytes counter */
  202.       NumByteToRead--;        
  203.     }   
  204.   }
  205.   /* Enable Acknowledgement to be ready for another reception */
  206.        
  207.         return pBuffer;
  208. }



  209. void speech_text(u8 *str,u8 encoding_format)
  210. {
  211.          u16 size = strlen(str) + 2;
  212.          
  213.          XFS_Protocol_TypeDef DataPack;
  214.        
  215.          DataPack.DataHead = DATAHEAD;
  216.          DataPack.Length_HH = size >>8;
  217.          DataPack.Length_LL = size;
  218.          DataPack.Commond = 0x01;
  219.          DataPack.EncodingFormat = encoding_format;
  220.          DataPack.Text = str;
  221.          
  222.          I2C_ByteWrite(DataPack.DataHead );
  223.          I2C_ByteWrite(DataPack.Length_HH);       
  224.          I2C_ByteWrite(DataPack.Length_LL);
  225.          I2C_ByteWrite(DataPack.Commond);       
  226.          I2C_ByteWrite(DataPack.EncodingFormat);               
  227.        
  228.          I2C_Writes_Bytes(DataPack.Text,strlen(DataPack.Text));         
  229. }

  230. void SetBase(u8 *str)
  231. {
  232.          u16 size = strlen(str) + 2;
  233.          
  234.          XFS_Protocol_TypeDef DataPack;
  235.        
  236.          DataPack.DataHead = DATAHEAD;
  237.          DataPack.Length_HH = size >>8;
  238.          DataPack.Length_LL = size;
  239.          DataPack.Commond = 0x01;
  240.          DataPack.EncodingFormat = 0x00;
  241.          DataPack.Text = str;
  242.          
  243.          I2C_ByteWrite(DataPack.DataHead );
  244.          I2C_ByteWrite(DataPack.Length_HH);       
  245.          I2C_ByteWrite(DataPack.Length_LL);
  246.          I2C_ByteWrite(DataPack.Commond);       
  247.          I2C_ByteWrite(DataPack.EncodingFormat);
  248.        
  249.          I2C_Writes_Bytes(DataPack.Text,strlen(DataPack.Text));
  250. }

  251. void TextCtrl(char c, int d)
  252. {
  253.   char str[10];
  254.   if (d != -1)
  255.     sprintf(str, "[%c%d]", c, d);
  256.   else
  257.     sprintf(str, "[%c]", c);
  258.   SetBase(str);
  259.        
  260. }

  261. void SetStyle(Style_Type style)
  262. {
  263.   TextCtrl('f', style);
  264.         while(GetChipStatus() != ChipStatus_Idle)
  265.         {
  266.           delay(10);
  267.         }
  268. }

  269. void SetLanguage(Language_Type language)
  270. {
  271.           TextCtrl('g', language);
  272.                 while(GetChipStatus() != ChipStatus_Idle)
  273.                 {
  274.           delay(10);
  275.                 }
  276. }

  277. void SetArticulation(Articulation_Type articulation)
  278. {
  279.   TextCtrl('h', articulation);
  280.         while(GetChipStatus() != ChipStatus_Idle)
  281.         {
  282.          delay(10);
  283.         }
  284. }

  285. void SetSpell(Spell_Type spell)
  286. {
  287.   TextCtrl('i', spell);
  288.         while(GetChipStatus() != ChipStatus_Idle)
  289.         {
  290.          delay(10);
  291.         }
  292. }

  293. void SetReader(Reader_Type reader)
  294. {
  295.   TextCtrl('m', reader);
  296.         while(GetChipStatus() != ChipStatus_Idle)
  297.         {
  298.          delay(10);
  299.         }
  300. }

  301. void SetNumberHandle(NumberHandle_Type numberHandle)
  302. {
  303.   TextCtrl('n', numberHandle);
  304.         while(GetChipStatus() != ChipStatus_Idle)
  305.         {
  306.          delay(10);
  307.         }
  308. }

  309. void SetZeroPronunciation(ZeroPronunciation_Type zeroPronunciation)
  310. {
  311.   TextCtrl('o', zeroPronunciation);
  312.         while(GetChipStatus() != ChipStatus_Idle)
  313.         {
  314.          delay(10);
  315.         }
  316. }


  317. void SetNamePronunciation(NamePronunciation_Type namePronunciation)
  318. {
  319.   TextCtrl('r', namePronunciation);
  320.         while(GetChipStatus() != ChipStatus_Idle)
  321.         {
  322.          delay(10);
  323.         }
  324. }

  325. void SetSpeed(int speed)
  326. {
  327.   TextCtrl('s', speed);
  328.         while(GetChipStatus() != ChipStatus_Idle)
  329.         {
  330.          delay(10);
  331.         }
  332. }

  333. void SetIntonation(int intonation)
  334. {
  335.   TextCtrl('t', intonation);
  336.         while(GetChipStatus() != ChipStatus_Idle)
  337.         {
  338.          delay(10);
  339.         }
  340. }

  341. void SetVolume(int volume)
  342. {
  343.   TextCtrl('v', volume);
  344.         while(GetChipStatus() != ChipStatus_Idle)
  345.         {
  346.          delay(10);
  347.         }
  348. }

  349. void SetOnePronunciation(OnePronunciation_Type onePronunciation)
  350. {
  351.   TextCtrl('y', onePronunciation);
  352.         while(GetChipStatus() != ChipStatus_Idle)
  353.         {
  354.          delay(10);
  355.         }
  356. }

  357. void SetRhythm(Rhythm_Type rhythm)
  358. {
  359.   TextCtrl('z', rhythm);
  360.         while(GetChipStatus() != ChipStatus_Idle)
  361.         {
  362.          delay(10);
  363.         }
  364. }

  365. void SetRestoreDefault()
  366. {
  367.   TextCtrl('d', -1);
  368.         while(GetChipStatus() != ChipStatus_Idle)
  369.         {
  370.          delay(10);
  371.         }
  372. }




复制代码
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6719
金钱
6719
注册时间
2017-4-12
在线时间
1257 小时
发表于 2022-4-13 16:02:44 | 显示全部楼层
你直接去看底层代码io配置不就知道是不是io冲突咯;冲突了的话,将iic的sda scl两个脚用另外的io就可以了
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2022-3-31
在线时间
5 小时
 楼主| 发表于 2022-4-14 10:40:50 | 显示全部楼层
245925587 发表于 2022-4-13 16:02
你直接去看底层代码io配置不就知道是不是io冲突咯;冲突了的话,将iic的sda scl两个脚用另外的io就可以了

PB7引脚和LCD屏幕的FSMC冲突了,现在想把之前的IIC1转到IIC2中运行,但是在上面的.c文件里把引脚改为对应的PB10\11,所有I2C1改为I2C2后运行没有反应,改到I2C2通讯的时候要怎么改变配置呢
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6719
金钱
6719
注册时间
2017-4-12
在线时间
1257 小时
发表于 2022-4-14 10:44:14 | 显示全部楼层
本帖最后由 245925587 于 2022-4-14 10:45 编辑
RyanZzzz 发表于 2022-4-14 10:40
PB7引脚和LCD屏幕的FSMC冲突了,现在想把之前的IIC1转到IIC2中运行,但是在上面的.c文件里把引脚改为对应 ...

用模拟iic咯,想用哪个脚用哪个,非要用硬件iic的话,一看io有没冲突,二跟着寄存器配置,基本都差不多的,一般就是时钟配置、io复位配置等这些
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2022-3-31
在线时间
5 小时
 楼主| 发表于 2022-4-14 11:38:54 | 显示全部楼层
245925587 发表于 2022-4-14 10:44
用模拟iic咯,想用哪个脚用哪个,非要用硬件iic的话,一看io有没冲突,二跟着寄存器配置,基本都差不多的 ...

硬件IIC怎么移植到软件IIC实现呢,现在用的硬件IIC程序是卖家提供的,现在不太理解这两者之间有怎样的联系
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6719
金钱
6719
注册时间
2017-4-12
在线时间
1257 小时
发表于 2022-4-14 14:18:02 | 显示全部楼层
改代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 14:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表