搜索
查看: 3112|回复: 12

[已解决] stm8 003f 软件模拟IIC的

[复制链接]

该用户从未签到

1

主题

9

帖子

0

蝴蝶豆

初级会员

最后登录
2019-7-3
发表于 2019-1-11 17:37:09 | 显示全部楼层 |阅读模式
各位大佬,小弟初入职场,刚开始使用单片机,公司要求用stm8003f做一块单板发出信号的从机,想确认一下,ST官网上下载的这个软件IIc从机的代码是否可以使用,有没有什么要注意的地方。
小弟下载后,烧录到单片机里面后,用另一块单板发送信号,不确定用另一块单板发送的主机信号是否正确,使用示波器看,也不会判断,所以想问一下,有没有使用过的大佬,给点建议,谢谢大佬,然后PB4,PB5这两个引脚是否要做什么特殊处理,因为在很多论坛的资料上,大家都说这两个引脚没有办法上啦,不知道作为从机的话,使用这两个引脚有没有什么要注意的地方,然后用这块单片机做从机的话,有没有办法给出什么反馈信息,可以方便我调试,谢谢各位大佬。
下面是,从官网上下载的程序的主要代码的部分
#include "I2c_slave_interrupt.h"
#define MAX_BUFFER  32

   u8 u8_My_Buffer[MAX_BUFFER];
   u8 *u8_MyBuffp;
   u8 MessageBegin;

// ********************** Data link function ****************************
// * These functions must be modified according to your application neeeds *
// * See AN document for more precision
// **********************************************************************

回复

使用道具 举报

该用户从未签到

1

主题

9

帖子

0

蝴蝶豆

初级会员

最后登录
2019-7-3
 楼主| 发表于 2019-1-11 17:37:59 | 显示全部楼层
void I2C_transaction_begin(void)
        {
                MessageBegin = TRUE;
        }
        void I2C_transaction_end(void)
        {
                //Not used in this example
        }
        void I2C_byte_received(u8 u8_RxData)
        {
                if (MessageBegin == TRUE  &&  u8_RxData < MAX_BUFFER) {
                        u8_MyBuffp= &u8_My_Buffer[u8_RxData];
                        MessageBegin = FALSE;
                }
    else if(u8_MyBuffp < &u8_My_Buffer[MAX_BUFFER])
      *(u8_MyBuffp++) = u8_RxData;
        }
        u8 I2C_byte_write(void)
        {
                if (u8_MyBuffp < &u8_My_Buffer[MAX_BUFFER])
                        return *(u8_MyBuffp++);
                else
                        return 0x00;
        }


// ********************** Data link interrupt handler *******************

#ifdef _RAISONANCE_
void I2C_Slave_check_event(void) interrupt 19 {
#endif
#ifdef _COSMIC_
@far @interrupt void I2C_Slave_check_event(void) {
#endif
        static u8 sr1;                                       
        static u8 sr2;
        static u8 sr3;
       
// save the I2C registers configuration
sr1 = I2C->SR1;
sr2 = I2C->SR2;
sr3 = I2C->SR3;

/* Communication error? */
  if (sr2 & (I2C_SR2_WUFH | I2C_SR2_OVR |I2C_SR2_ARLO |I2C_SR2_BERR))
  {               
    I2C->CR2|= I2C_CR2_STOP;  // stop communication - release the lines
    I2C->SR2= 0;                                            // clear all error flags
        }
/* More bytes received ? */
  if ((sr1 & (I2C_SR1_RXNE | I2C_SR1_BTF)) == (I2C_SR1_RXNE | I2C_SR1_BTF))
  {
    I2C_byte_received(I2C->DR);
  }
/* Byte received ? */
  if (sr1 & I2C_SR1_RXNE)
  {
    I2C_byte_received(I2C->DR);
  }
/* NAK? (=end of slave transmit comm) */
  if (sr2 & I2C_SR2_AF)
  {       
    I2C->SR2 &= ~I2C_SR2_AF;          // clear AF
                I2C_transaction_end();
        }
/* Stop bit from Master  (= end of slave receive comm) */
  if (sr1 & I2C_SR1_STOPF)
  {
    I2C->CR2 |= I2C_CR2_ACK;          // CR2 write to clear STOPF
                I2C_transaction_end();
        }
/* Slave address matched (= Start Comm) */
  if (sr1 & I2C_SR1_ADDR)
  {         
                I2C_transaction_begin();
        }
/* More bytes to transmit ? */
  if ((sr1 & (I2C_SR1_TXE | I2C_SR1_BTF)) == (I2C_SR1_TXE | I2C_SR1_BTF))
  {
                I2C->DR = I2C_byte_write();
  }
/* Byte to transmit ? */
  if (sr1 & I2C_SR1_TXE)
  {
                I2C->DR = I2C_byte_write();
  }       
        GPIOD->ODR^=1;
}
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

9

帖子

0

蝴蝶豆

初级会员

最后登录
2019-7-3
 楼主| 发表于 2019-1-11 17:38:15 | 显示全部楼层
// ************************* I2C init Function  *************************

void Init_I2C (void)
{
        #ifdef I2C_slave_7Bits_Address
                /* Set I2C registers for 7Bits Address */
                I2C->CR1 |= 0x01;                                                // Enable I2C peripheral
                I2C->CR2 = 0x04;                                                              // Enable I2C acknowledgement
                I2C->FREQR = 16;                                                       // Set I2C Freq value (16MHz)
                I2C->OARL = (SLAVE_ADDRESS << 1) ;        // set slave address to 0x51 (put 0xA2 for the register dues to7bit address)
                I2C->OARH = 0x40;                                                      // Set 7bit address mode

        #endif
        #ifdef I2C_slave_10Bits_Address
          /* Set I2C registers for 10Bits Address */
          I2C->CR1 |= 0x01;                                  // Enable I2C peripheral
          I2C->CR2 = 0x04;                                        // Enable I2C acknowledgement
          I2C->FREQR = 16;                                         // Set I2C Freq value (16MHz)
          I2C->OARL = (SLAVE_ADDRESS & 0xFF) ;                                                        // set slave address LSB
          I2C->OARH = 0xC0 | ((SLAVE_ADDRESS & 0x300) >> 7);        // Set 10bits address mode and address MSB
        #endif
       
        I2C->ITR        = 0x07;                                              // all I2C interrupt enable  
}
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

9

帖子

0

蝴蝶豆

初级会员

最后登录
2019-7-3
 楼主| 发表于 2019-1-11 17:38:31 | 显示全部楼层
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "I2c_slave_interrupt.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/* Public functions ----------------------------------------------------------*/

/*
  * Example firmware main entry point.
  * Parameters: None
  * Retval . None
  */
       
void main(void)
{
       
        CLK->CKDIVR = 0;                // sys clock /1

        /* Init GPIO for I2C use */
        GPIOE->CR1 |= 0x06;
        GPIOE->DDR &= ~0x06;
        GPIOE->CR2 &= ~0x06;

        /* Initialise I2C for communication */
        Init_I2C();
       
        /* Enable general interrupts */
        enableInterrupts();
       
        /*Main Loop */
  while(1)
   {
                 
         };
       
}

/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

9

帖子

0

蝴蝶豆

初级会员

最后登录
2019-7-3
 楼主| 发表于 2019-1-11 17:38:52 | 显示全部楼层
*        BASIC INTERRUPT VECTOR TABLE FOR STM8 devices
*        Copyright (c) 2007 STMicroelectronics
*/
#include "I2c_slave_interrupt.h"

typedef void @far (*interrupt_handler_t)(void);

struct interrupt_vector {
        unsigned char interrupt_instruction;
        interrupt_handler_t interrupt_handler;
};


@far @interrupt void NonHandledInterrupt(void)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
}

extern void _stext();     /* startup routine */

struct interrupt_vector const _vectab[] = {
        {0x82, (interrupt_handler_t)_stext}, /* reset */
        {0x82, NonHandledInterrupt}, /* trap  */
        {0x82, NonHandledInterrupt}, /* irq0  */
        {0x82, NonHandledInterrupt}, /* irq1  */
        {0x82, NonHandledInterrupt}, /* irq2  */
        {0x82, NonHandledInterrupt}, /* irq3  */
        {0x82, NonHandledInterrupt}, /* irq4  */
        {0x82, NonHandledInterrupt}, /* irq5  */
        {0x82, NonHandledInterrupt}, /* irq6  */
        {0x82, NonHandledInterrupt}, /* irq7  */
        {0x82, NonHandledInterrupt}, /* irq8  */
        {0x82, NonHandledInterrupt}, /* irq9  */
        {0x82, NonHandledInterrupt}, /* irq10 */
        {0x82, NonHandledInterrupt}, /* irq11 */
        {0x82, NonHandledInterrupt}, /* irq12 */
        {0x82, NonHandledInterrupt}, /* irq13 */
        {0x82, NonHandledInterrupt}, /* irq14 */
        {0x82, NonHandledInterrupt}, /* irq15 */
        {0x82, NonHandledInterrupt}, /* irq16 */
        {0x82, NonHandledInterrupt}, /* irq17 */
        {0x82, NonHandledInterrupt}, /* irq18 */
        {0x82, (interrupt_handler_t) I2C_Slave_check_event}, /* irq19 */
        {0x82, NonHandledInterrupt}, /* irq20 */
        {0x82, NonHandledInterrupt}, /* irq21 */  
        {0x82, NonHandledInterrupt}, /* irq22 */
        {0x82, NonHandledInterrupt}, /* irq23 */
        {0x82, NonHandledInterrupt}, /* irq24 */
        {0x82, NonHandledInterrupt}, /* irq25 */
        {0x82, NonHandledInterrupt}, /* irq26 */
        {0x82, NonHandledInterrupt}, /* irq27 */
        {0x82, NonHandledInterrupt}, /* irq28 */
        {0x82, NonHandledInterrupt}, /* irq29 */
};
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1277

帖子

30

蝴蝶豆

金牌会员

最后登录
2020-7-4
发表于 2019-1-11 22:34:55 | 显示全部楼层
用逻辑分析仪看啊。。。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

9

帖子

0

蝴蝶豆

初级会员

最后登录
2019-7-3
 楼主| 发表于 2019-1-12 08:44:58 | 显示全部楼层
zcl201207 发表于 2019-1-11 22:34
用逻辑分析仪看啊。。。

没有用过逻辑分析仪,也没买那个东西,谢谢您告诉我这个方法,我想知道,您知道这个官网上面的案例代码是否真实可用呢?
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

9

帖子

0

蝴蝶豆

初级会员

最后登录
2019-7-3
 楼主| 发表于 2019-1-12 08:51:00 | 显示全部楼层
zcl201207 发表于 2019-1-11 22:34
用逻辑分析仪看啊。。。

我刚刚查了逻辑分析仪,应该来说逻辑分析仪看和用示波器看是一样的,我现在的问题在于,不知道我所用的主机发出来的iic信号是否符合stm8作为从机所需要的iic主机信号,如果说,这个代码我能够确定是一定能用的话,我就要往,主机发送数据方面想办法改进,就不用在从机这边再做很多功夫了,然后,通道数的话 ,我只需要一根通道的,所以,应该是不需要用逻辑分析仪吧?
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

9

帖子

0

蝴蝶豆

初级会员

最后登录
2019-7-3
 楼主| 发表于 2019-1-12 11:16:15 | 显示全部楼层
zcl201207 发表于 2019-1-11 22:34
用逻辑分析仪看啊。。。

刚才用示波器看见了完整的波形了,在第七位的时候 ,没有发出应答信号,我不知道为什么人家说有应答信号呢?
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

9

帖子

0

蝴蝶豆

初级会员

最后登录
2019-7-3
 楼主| 发表于 2019-1-14 14:13:26 | 显示全部楼层
自己顶起来!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-25 18:36 , Processed in 1.198843 second(s), 43 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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