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

stm8 003f 软件模拟IIC的

[复制链接]
mike1996 提问时间:2019-1-11 17:37 /
各位大佬,小弟初入职场,刚开始使用单片机,公司要求用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
// **********************************************************************

收藏 评论12 发布时间:2019-1-11 17:37

举报

12个回答
mike1996 回答时间: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;
}
mike1996 回答时间: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  
}
mike1996 回答时间: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****/
mike1996 回答时间: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 */
};
zcl201207 回答时间:2019-1-11 22:34:55
用逻辑分析仪看啊。。。

评分

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

查看全部评分

mike1996 回答时间:2019-1-12 08:44:58
zcl201207 发表于 2019-1-11 22:34
用逻辑分析仪看啊。。。

没有用过逻辑分析仪,也没买那个东西,谢谢您告诉我这个方法,我想知道,您知道这个官网上面的案例代码是否真实可用呢?
mike1996 回答时间:2019-1-12 08:51:00
zcl201207 发表于 2019-1-11 22:34
用逻辑分析仪看啊。。。

我刚刚查了逻辑分析仪,应该来说逻辑分析仪看和用示波器看是一样的,我现在的问题在于,不知道我所用的主机发出来的iic信号是否符合stm8作为从机所需要的iic主机信号,如果说,这个代码我能够确定是一定能用的话,我就要往,主机发送数据方面想办法改进,就不用在从机这边再做很多功夫了,然后,通道数的话 ,我只需要一根通道的,所以,应该是不需要用逻辑分析仪吧?
mike1996 回答时间:2019-1-12 11:16:15
zcl201207 发表于 2019-1-11 22:34
用逻辑分析仪看啊。。。

刚才用示波器看见了完整的波形了,在第七位的时候 ,没有发出应答信号,我不知道为什么人家说有应答信号呢?
mike1996 回答时间:2019-1-14 14:13:26
自己顶起来!!!
斜阳 回答时间:2019-1-14 14:58:03
mike1996 发表于 2019-1-12 11:16
刚才用示波器看见了完整的波形了,在第七位的时候 ,没有发出应答信号,我不知道为什么人家说有应答信号 ...

1、逻辑分析仪和示波器侧重点不一样。2、把完整波形发出来、3、先把I2C协议弄懂了再判断
仙景 回答时间:2019-1-14 15:08:16
应答是第九位,由从机拉低,如果不拉低,从机也可以工作,证明从机不管应答信号,主机也可丢掉,继续工作即可。硬件IIC不好用,用模拟的也行,毕竟就几个信号,开始,停止,写地址,读数据……

评分

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

查看全部评分

zhubin119 回答时间:2019-1-15 14:52:30
感谢楼主的分享

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版