找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2842|回复: 2
收起左侧

stm32f103RCT6硬件I2C实现科大讯飞TTS语音合成芯片XFS5152CE的通信

[复制链接]
ID:725835 发表于 2020-4-10 10:27 | 显示全部楼层 |阅读模式
折腾了半天,终于用stm32的硬件I2C实现了科大讯飞TTS语音合成芯片XFS5152CE的通信,XFS5152CE作为I2C接口的从设备,设备地址为: 0x80。为保证通讯的稳定性,XFS5152CE的I2C接口通信速度要求不高于15KHZ。由于I2C的一般速度是100KHZ,高速传输速率400KHZ,所有I2C的速率我设为10KZH,同时还要把占空比设第点,否则不行的。
回复

使用道具 举报

ID:328014 发表于 2020-4-10 13:26 | 显示全部楼层
能分享一下代码吗?
回复

使用道具 举报

ID:725835 发表于 2020-4-10 14:26 | 显示全部楼层
  1. #include "i2c_tts.h"
  2. #include "delay.h"
  3. #include <string.h>
  4. #define I2C_Speed              10000           //快速模式10k
  5. #define I2C1_TTS_SLAVE_ADDRESS7    0x80              //从机地址
  6. //XFS5152CE作为I2C接口的从设备,设备地址为: 0x80。
  7. //为保证通讯的稳定性,XFS5152CE的I2C接口通信速度要求不高于15KHZ。
  8. /**************************************************
  9. *函数名称:void I2C_TTS_GPIO_Configuration(void)
  10. *
  11. *入口参数:无
  12. *
  13. *出口参数:无
  14. *
  15. *功能说明:配置使用的I/ O端口引脚
  16. ***************************************************/
  17. void I2C_TTS_GPIO_Configuration(void)
  18. {
  19.     GPIO_InitTypeDef  GPIO_InitStructure;
  20.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  21.     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;  //配置I2C1 PB6-SCL和PB7-SDA
  22.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                   //管脚频率为50MHZ
  23.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;                   //模式为复用开漏输出,因此两个引脚要接上拉电阻
  24.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  25. }
  26. /**************************************************
  27. *函数名称:void I2C_TTS_Configuration(void)
  28. *
  29. *入口参数:无
  30. *
  31. *出口参数:无
  32. *
  33. *功能说明:I2C Configuration
  34. ***************************************************/
  35. void I2C_TTS_Configuration(void)
  36. {
  37.     I2C_InitTypeDef  I2C_InitStructure;
  38.     //定义I2C初始化结构体I2C_InitStructure
  39.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);

  40.     I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;                         //I2C模式
  41.     I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9;
  42.     //占空比一定要选I2C_DutyCycle_16_9,不能选I2C_DutyCycle_2,因为TTS的速率不能超过15KHZ
  43.     I2C_InitStructure.I2C_OwnAddress1 = I2C1_TTS_SLAVE_ADDRESS7;         //TTS地址(0x80)使能应答
  44.     I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  45.     I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;        //应答7位地址
  46.     I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;

  47.     I2C_Init(I2C1, &I2C_InitStructure);                         //初始化I2C
  48.     I2C_Cmd(I2C1, ENABLE);                                              //使能I2C1
  49. }
  50. /**************************************************
  51. *函数名称:void I2C_TTS_Init()
  52. *
  53. *入口参数:无
  54. *
  55. *出口参数:无
  56. *
  57. *功能说明:初始化用于I2C TTS驱动的外设
  58. ***************************************************/
  59. void I2C_TTS_Init()
  60. {
  61.     I2C_TTS_GPIO_Configuration();
  62.     I2C_TTS_Configuration();
  63. }

  64. /**************************************************
  65. *函数名称:void I2C_TTS_Write(u8 *pBuffer, u8 NumByteToWrite)
  66. *
  67. *入口参数:pBuffer指向写入的数据缓冲区,NumByteToWrite写入TTS的字节数
  68. *
  69. *出口参数:无
  70. *
  71. *功能说明:写入多个字节的TTS。
  72. ***************************************************/
  73. void I2C_TTS_Write(u8 *pBuffer, u8 NumByteToWrite)
  74. {
  75.     I2C_GenerateSTART(I2C1, ENABLE);                                 //起始信号
  76.     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));   //  测试和清除EV5

  77.     I2C_Send7bitAddress(I2C1, I2C1_TTS_SLAVE_ADDRESS7, I2C_Direction_Transmitter);         //发送写TTS地址
  78.     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));  // 测试和清除EV6

  79.     while(NumByteToWrite--)
  80.     {
  81.         I2C_SendData(I2C1, *pBuffer);           //发送当前字节
  82.         pBuffer++;                       //下一个被写入的字节
  83.         while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));         // 测试和清除EV8
  84.     }
  85.     I2C_GenerateSTOP(I2C1, ENABLE);          //停止信号
  86. }
  87. /***********************************************************
  88. * 名    称:  XFS5051 文本合成语音函数
  89. * 功    能:  发送合成文本到XFS5051芯片进行合成播放
  90. * 入口参数:  *pData:文本指针变量
  91. * 出口参数:  无
  92. * 说    明: 本函数用于文本合成语音。                                         
  93. **********************************************************/
  94. void TTS_SendFrameInfo(u8 *pData)
  95. {
  96. /****************需要发送的文本**********************************/
  97.                  u8 Frame_Info[45];
  98.          u8 dataLength = strlen((const char *)pData);        //需要发送文本的长度
  99.                  
  100. /*****************帧固定配置信息**************************************/           
  101.                  Frame_Info[0] = 0xFD ;                         //构造帧头FD
  102.                  Frame_Info[1] = 0x00 ;                         //构造数据区长度的高字节
  103.                  Frame_Info[2] = dataLength+2;                 //构造数据区长度的低字节
  104.                  Frame_Info[3] = 0x01 ;                         //构造命令字:合成播放命令                                  
  105.                  Frame_Info[4] = 0x01;              //文本编码格式:GBK

  106. /*******************发送帧信息***************************************/                  
  107.          memcpy(&Frame_Info[5], pData, dataLength);
  108.                  I2C_TTS_Write(Frame_Info,5+dataLength); //发送帧配置
  109.                
  110. }
复制代码
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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