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

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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版