你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Master :STM32F030C8T6 slave :BS8116A-3 透过I2C传输

[复制链接]
阿毛阿毛 提问时间:2016-3-28 16:10 /
请教各位前辈 小弟在做BS8116A-3 initial时卡在下面(红色)这一行就不会往下跑了,很苦脑..   


/*   BS8116A-3 write setting Register        */
        I2C_TransferHandling(I2C1, 0x50, 22, I2C_Reload_Mode,I2C_Generate_Start_Read);
        (ochar('a'));
        I2C_SendData(I2C1, 0xB0);
        (ochar('g'));
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR)==RESET );
        (ochar('b'));
        I2C_SendData(I2C1, 0x00);          //Option1
        (ochar('c'));
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE)==RESET );
        (ochar('d'));
        I2C_SendData(I2C1, 0x00);          //Reserve
        (ochar('e'));
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) ==RESET);
        (ochar('f'));
        I2C_SendData(I2C1, 0x83);          //Reserve
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0xF3);          //Reserve
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x98);          //Option2
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);          //K1_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K2_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K3_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K4_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K5_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K6_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K7_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K8_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K9_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K10_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K11_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K12_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K13_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K14_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K15_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K16_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0xEE);         //checksum  (get low byte)
        (ochar('z'));




完整程式如下
======================================================================


/* code */
#include "firmware.h"
#include "flags.h"


my_ubyte GlobeOption[ ];        // jimmy  add
my_ubyte flag[1];
volatile my_uint32 tmcount;
volatile uarts uart;
my_uint32 buzzer_count;


static USART_InitTypeDef USART_InitStructure;
static void InitPortA(void);
static void InitPortB(void);
static void InitSysTick(void);
static void Init_NVICSetup(void);
static void  Init_BS8116A_3(void);     //jimmy add
void InitialGlobal(void);                        // jimmy  add
static void Init_UART0Config(void);
void I2C1_Write(unsigned char data, unsigned char  WriteAddr);
unsigned char I2C1_Read(unsigned char ReadAddr);


void init(void)
{
        Init_NVICSetup();
        InitPortA();
        InitPortB();
        Init_UART0Config();
        InitSysTick();
        Init_BS8116A_3();
        InitialGlobal();
}

void reset(void)
{
        NVIC_SystemReset();
}


/**********************************
* ���GPIO
* *******************************/
static void InitPortA(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        /* GPIOA Periph clock enable */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);

        /* �����SART1��PIO TX */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        /* �����SART1��PIO RX */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* Connect PA9 to USART1_TX */
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
        /* Connect PA10 to USART1_RX */
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);
        

}

static void InitPortB(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        /* GPIOB Periph clock enable */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
        /*Configure GPIO pin for LCD Controller */


        /*Configure GPIO pin for LCD Controller */
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;                   // Jimmy  SCL   SDA
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
                GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
                GPIO_Init(GPIOB, &GPIO_InitStructure);

                GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_1);

                GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_1);



        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

}



static void InitSysTick(void)
{
        /* SysTick */
        if (SysTick_Config(SystemCoreClock / 1000))
        {
                /* Capture error */
                while (1);
        }
}
static void Init_NVICSetup(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        /* NVIC configuration */
        /* Enable the USARTx Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}




void beep(void)
{
        /*        if(~IS_CLOSE_BEEP)        */
        {
                GPIOB->BSRR = GPIO_Pin_4;
                buzzer_count = tmcount;
                SET_BUZZER;
        }
}
void stpbeep(void)
{
        GPIOB->BRR = GPIO_Pin_4;
        CLR_BUZZER;
}



static void Init_UART0Config(void)
{
        /* Enable USART1 clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

        /* USARTx configured as follow:
        - BaudRate = 9600 baud
        - Word Length = 8 Bits
        - One Stop Bit
        - None parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
        */
        USART_InitStructure.USART_BaudRate =9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
        USART_Init(USART1, &USART_InitStructure);

        /* Enable the USARTx Receive interrupt: this interrupt is generated when the
                USARTx receive data register is not empty */
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        /* Enable USART */
        USART_Cmd(USART1, ENABLE);
        init_uart();
}

void init_uart(void)
{
         uart.rsflags = 0;
         uart.rq0 = 0;
         uart.rq1 = 0;
         uart.tq0 = 0;
         uart.tq1 = 0;
         SET_SEDEND;
}
my_byte ochar(my_ubyte c)
{
        my_byte tx;
        tx=uart.tq1;
        tx++;

        if(tx==UART_BUF_LEN)        tx=0;
        if(tx!=uart.tq0)
        {

                uart.tbuffer[uart.tq1]=c;
                uart.tq1=tx;
                USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
                while(!IS_SEDEND);
                CLR_SEDEND;        
                return 0;
        }
        else
                return -1;
}

my_int16 ichar(void)
{
         if(uart.rq0 != uart.rq1)
         {
                my_int16 h;

          h = uart.rbuffer[uart.rq0++];
          if(uart.rq0 == UART_BUF_LEN) uart.rq0 = 0;
          return h;
         }
         else return -1;
}



static void Init_BS8116A_3(void)
{
        I2C_InitTypeDef I2C_InitStructure;
        /* Configure the I2C clock source. The clock is derived from the HSI */
        RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
        /*!< I2C Periph clock enable */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);     // 启用 I2C1 的 RCC 时钟

           //*I2C configuration
        I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;  // I2C 模式
        I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
        I2C_InitStructure.I2C_DigitalFilter = 0x00;
        I2C_InitStructure.I2C_OwnAddress1 = 0x00;  // own address, not relevant in master mode
        I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
        I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;  // 设定 I2C 地址长度为 7 bit
        //I2C_InitStructure.I2C_Timing = 0x00901D2B;
        I2C_InitStructure.I2C_Timing = 0x00201D2B/*0x1045061D*//*0x00210507*//*0xB0420F13*//*0xFFFFFFFF*/;

        /* Apply I2C configuration after enabling it */
        I2C_Init(I2C1, &I2C_InitStructure); // 初始化 I2C1

        /* I2C Peripheral Enable */
        I2C_Cmd(I2C1, ENABLE);   // 启用 I2C1

        
/*   BS8116A-3 write setting Register        */
        I2C_TransferHandling(I2C1, 0x50, 22, I2C_Reload_Mode,I2C_Generate_Start_Read);
        (ochar('a'));
        I2C_SendData(I2C1, 0xB0);
        (ochar('g'));
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR)==RESET );
        (ochar('b'));
        I2C_SendData(I2C1, 0x00);          //Option1
        (ochar('c'));
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE)==RESET );
        (ochar('d'));
        I2C_SendData(I2C1, 0x00);          //Reserve
        (ochar('e'));
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) ==RESET);
        (ochar('f'));
        I2C_SendData(I2C1, 0x83);          //Reserve
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0xF3);          //Reserve
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x98);          //Option2
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);          //K1_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K2_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K3_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K4_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K5_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K6_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K7_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K8_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K9_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K10_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K11_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K12_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K13_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K14_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K15_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0x08);           //K16_TH
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET );
        I2C_SendData(I2C1, 0xEE);         //checksum  (get low byte)
        (ochar('z'));

}


void InitialGlobal(void)
{
        GlobeOption[0]=0;
        GlobeOption[1]=0;
        GlobeOption[2]=GlobeOptionA;
        GlobeOption[3]=GlobeOptionB;
        GlobeOption[4]=GlobeOptionC;
        GlobeOption[5] =Key1Threshold;
        GlobeOption[6] =Key2Threshold;
        GlobeOption[7]=Key3Threshold;
        GlobeOption[8]=Key4Threshold;
        GlobeOption[9]=Key5Threshold;
        GlobeOption[10]=Key6Threshold;
        GlobeOption[11]=Key7Threshold;
        GlobeOption[12]=Key8Threshold;
        GlobeOption[13]=Key9Threshold;
        GlobeOption[14]=Key10Threshold;
        GlobeOption[15]=Key11Threshold;
        GlobeOption[16]=Key12Threshold;
        GlobeOption[17]=Key13Threshold;
        GlobeOption[18]=Key14Threshold;
        GlobeOption[19]=Key15Threshold;
        GlobeOption[20]=Key16Threshold;
}


//*******************************************************************************
//     : void I2C2_Write(unsigned char data, unsigned char  WriteAddr)
//******************************************************************************

void I2C1_Write(unsigned char data, unsigned char  WriteAddr)
{

  I2C_TransferHandling(I2C1, 0x50, 1, I2C_Reload_Mode, I2C_Generate_Start_Write);

  while(I2C_GetFlagStatus(I2C1, I2C_ISR_TXIS) == RESET);

  I2C_SendData(I2C1, WriteAddr);

  while(I2C_GetFlagStatus(I2C1, I2C_ISR_TCR) == RESET);


  I2C_TransferHandling(I2C1, 0x50, 1, I2C_AutoEnd_Mode, I2C_No_StartStop);

  while(I2C_GetFlagStatus(I2C1, I2C_ISR_TXIS) == RESET);

  I2C_SendData(I2C1, data);

  while(I2C_GetFlagStatus(I2C1, I2C_ISR_STOPF) == RESET);

  I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);

}

//*******************************************************************************
//   : unsigned char I2C1_Read(unsigned char ReadAddr)
//******************************************************************************
unsigned char I2C1_Read(unsigned char ReadAddr)
{

  unsigned char temp;
  ochar('D');
  I2C_TransferHandling(I2C1, 0x50, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
  ochar('E');
  while(I2C_GetFlagStatus(I2C1, I2C_ISR_TXIS) == SET);
  ochar('F');
  I2C_SendData(I2C1, ReadAddr);
  ochar('G');
  while(I2C_GetFlagStatus(I2C1, I2C_ISR_TC) == SET);
  ochar('H');
  I2C_TransferHandling(I2C1, 0x50, 1, I2C_AutoEnd_Mode, I2C_Generate_Start_Read);
  ochar('I');
  while(I2C_GetFlagStatus(I2C1, I2C_ISR_RXNE) == SET);
  ochar('J');
  temp = I2C_ReceiveData(I2C1);
  ochar('K');
  while(I2C_GetFlagStatus(I2C1, I2C_ISR_STOPF) == SET);
  ochar('L');
  I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);
  ochar('M');
  return temp;
  ochar('N');
}













BS8116A-3 Touch-key Sensitivity Setting Register.png
BS8116A-3 Write Setting Register.png
收藏 1 评论15 发布时间:2016-3-28 16:10

举报

15个回答
野火_firege 回答时间:2016-3-28 17:23:04
帮你消灭下0回复
肽宰1 回答时间:2016-3-28 18:02:32
linux跑windows,大家都是windows跑linux,
wofei1314 回答时间:2017-2-28 11:06:10
我也在用它 ,IO模拟方式....

调了一个周
wqiang123 回答时间:2017-3-11 19:20:22
我也遇到与你相同的问题,现在刚调通 分享给你吧
http://blog.csdn.net/beep_/article/details/61423951
wqiang123 回答时间:2017-3-11 19:21:23
wofei1314 发表于 2017-2-28 11:06
我也在用它 ,IO模拟方式....

调了一个周

我也遇到与你相同的问题,现在刚调通 分享给你吧
http://blog.csdn.net/beep_/article/details/61423951
wofei1314 回答时间:2017-3-12 16:23:27
wqiang123 发表于 2017-3-11 19:21
我也遇到与你相同的问题,现在刚调通 分享给你吧
http://blog.csdn.net/beep_/article/details/61423951 ...

谢谢啦
xueshawu 回答时间:2017-4-28 10:01:08
触摸触发门限值 一般选用多少啊;能把你调好的程序给我参考下么
xueshawu 回答时间:2017-5-11 16:05:55
wofei1314 发表于 2017-2-28 11:06
我也在用它 ,IO模拟方式....

调了一个周

我也用IO模拟的方式;我现在的问题就是,触摸分析出来的结果 成功率很低;经常误触发;请问在按键值分析方面有什么需要注意的么?我采用的方式是switch分析,每次只能有一个按键被触摸,多个按键触摸就会返回错误值
xueshawu 回答时间:2017-5-11 16:07:50
wqiang123 发表于 2017-3-11 19:21
我也遇到与你相同的问题,现在刚调通 分享给你吧
http://blog.csdn.net/beep_/article/details/61423951 ...

我的IIC倒是通了,设置寄存器值都没问题;但是触摸按键的返回值经常是错的,比如触摸的是KEY;有可能会返回key6被触摸的值
xueshawu 回答时间:2017-5-11 20:24:54
wofei1314 发表于 2017-2-28 11:06
我也在用它 ,IO模拟方式....

调了一个周

用IO模拟方式,需要接上拉电阻么
wofei1314 回答时间:2017-5-12 14:38:01
xueshawu1 发表于 2017-5-11 20:24
用IO模拟方式,需要接上拉电阻么

需要,IIC都是需要上拉的
zbber 回答时间:2017-5-12 19:43:41
我也遇到与你相同的问题,现在刚调通 分享给你吧
xueshawu 回答时间:2017-5-13 16:10:16
wofei1314 发表于 2017-5-12 14:38
需要,IIC都是需要上拉的

这个IC貌似不需要,我现在的问题,就是KEY的识别 成功率不高;这个里面应该不存在什么软件算法吧;我倒是认为跟PCB关系很大;我现在这个板子上按键的铜箔面积不大;如何提高按键识别的成功率,能指点下么
xueshawu 回答时间:2017-5-13 16:10:57
zbber 发表于 2017-5-12 19:43
我也遇到与你相同的问题,现在刚调通 分享给你吧

求分享,如何提高按键识别 的成功率
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版