阿毛阿毛 发表于 2016-3-28 16:10:19

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

请教各位前辈 小弟在做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[ ];      // jimmyadd
my_ubyte flag;
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 voidInit_BS8116A_3(void);   //jimmy add
void InitialGlobal(void);                        // jimmyadd
static void Init_UART0Config(void);
void I2C1_Write(unsigned char data, unsigned charWriteAddr);
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;                   // JimmySCL   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=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;
          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;
      GlobeOption=0;
      GlobeOption=GlobeOptionA;
      GlobeOption=GlobeOptionB;
      GlobeOption=GlobeOptionC;
      GlobeOption =Key1Threshold;
      GlobeOption =Key2Threshold;
      GlobeOption=Key3Threshold;
      GlobeOption=Key4Threshold;
      GlobeOption=Key5Threshold;
      GlobeOption=Key6Threshold;
      GlobeOption=Key7Threshold;
      GlobeOption=Key8Threshold;
      GlobeOption=Key9Threshold;
      GlobeOption=Key10Threshold;
      GlobeOption=Key11Threshold;
      GlobeOption=Key12Threshold;
      GlobeOption=Key13Threshold;
      GlobeOption=Key14Threshold;
      GlobeOption=Key15Threshold;
      GlobeOption=Key16Threshold;
}


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

void I2C1_Write(unsigned char data, unsigned charWriteAddr)
{

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');
}













野火_firege 发表于 2016-3-28 17:23:04

帮你消灭下0回复

肽宰1 发表于 2016-3-28 18:02:32

linux跑windows,大家都是windows跑linux,:lol:lol

wofei1314 发表于 2017-2-28 11:06:10

我也在用它 ,IO模拟方式....

调了一个周:L:L:L

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 ...

谢谢啦

xueshawu1 发表于 2017-4-28 10:01:08

触摸触发门限值 一般选用多少啊;能把你调好的程序给我参考下么

xueshawu1 发表于 2017-5-11 16:05:55

wofei1314 发表于 2017-2-28 11:06
我也在用它 ,IO模拟方式....

调了一个周

我也用IO模拟的方式;我现在的问题就是,触摸分析出来的结果 成功率很低;经常误触发;请问在按键值分析方面有什么需要注意的么?我采用的方式是switch分析,每次只能有一个按键被触摸,多个按键触摸就会返回错误值

xueshawu1 发表于 2017-5-11 16:07:50

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

我的IIC倒是通了,设置寄存器值都没问题;但是触摸按键的返回值经常是错的,比如触摸的是KEY;有可能会返回key6被触摸的值
页: [1] 2
查看完整版本: Master :STM32F030C8T6 slave :BS8116A-3 透过I2C传输